opencv: показать изображение из sqlite3 - PullRequest
0 голосов
/ 19 мая 2019

Я хочу imshow с opencv, который я сохранил в типе блоба базы данных.

Я пробовал так:

import numpy as np

def check(self):
    self.create_database("resimler.db")
    sorgu="select RESİM from resimler where ID=?"
    ıd=3
    self.cursor.execute(sorgu,(ıd,))
    blob_data=self.cursor.fetchone()[0]
    nparr  = np.fromstring(blob_data, np.uint8)
    img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    image=cv2.resize(img_np,(130,100))
    cv2.imshow("data",image)

Я получаю эту ошибку ошибка: (-215) ssize.width> 0 && ssize.height> 0 в функции cv :: resize


Я поставил данные таким образом

def kaydet(self,resim,ad):     
sorgu="insert into resimler (RESİM,AD) values (?,?)"
self.cursor.execute(sorgu,[sqlite3.Binary(resim),ad])
self.baglantı.commit()

картинка, которую я получаю из видео захвата OpenCV, таким образом

        while True:
        (_, im) = self.cap.read() 
        gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 
        faces = face_cascade.detectMultiScale(gray, 1.3, 4) 
        for (x, y, w, h) in faces: 
        cv2.rectangle(im, (x, y), (x + w, y + h), (255, 0, 0), 2) 
        face = gray[y:y + h, x:x + w] 
        face_resize = cv2.resize(face, (width, height))
        cv2.imshow("img",face_resize)
        resimler.append(face_resize)

        cv2.imshow('OpenCV', im)
        sayıcı+=1

        if cv2.waitKey(1) == ord('q'):
        cv2.destroyAllWindows()
        self.show_frame()
        self.main()
        break
        if sayıcı%100==0:
        resim=resimler[len(resimler)//2]
        cv2.imshow("resim",resim)
        self.create_database("resimler.db")
        self.kaydet(resim,"resim")
        self.kapat()
        print("kaydedildi")
        self.main()
        break

1 Ответ

0 голосов
/ 20 мая 2019

Я не могу легко понять ваш код, потому что слишком много частей отсутствует, и он плохо отформатирован / с отступом, но я могу попытаться помочь.

Вы, кажется, звоните cv2.imdecode(), когда читаетеданные обратно из базы данных.Эта функция ожидает изображение в кодировке JPEG или PNG, которое начинается как файл JPEG (ff d8) или PNG (89 50) с правильной подписью:

Для JPEG:

ffd8 ffe0 0010 4a46 4946 0001 0100 0001  ......JFIF......

Для PNG:

8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR

Когда вы сохраняете изображение в базе данных, вы, похоже, сохраняете массив Numpy - хотя я не уверен.Но если вы передадите это cv2.imdecode(), оно не будет работать.

Итак, вам нужно:

  • сохранить JPG / PNG в базе данных (что будетбыть меньше, но менее точным) и использовать cv2.imencode() для записи и cv2.imdecode() для чтения

  • или сохранить массив Numpy в базе данных и не декодировать его.

Но одна вещь наверняка, вы не можете сделать смесь.

...