ソースコード
import os,sys
import sqlite3
import cv2
DBPATH='database.sqlite'
# db connect
if os.path.exists(DBPATH):
connection = sqlite3.connect(DBPATH)
else:
print(DBPATH+' not found.')
sys.exit(1)
connection.row_factory = sqlite3.Row
connection.text_factory = bytes # これがないとエラーが出る:sqlite3.Error occurred: Could not decode to UTF-8 column
cursor = connection.cursor()
res = None
try:
cursor.execute('select * from ref_image')
res = cursor.fetchall()
except sqlite3.Error as e:
print('Error:', e.args[0])
connection.close()
img = cv2.imread(res[1]['image'])
cv2.imshow("view jpg from sqlite3 db",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
エラー
SystemError: returned NULL without setting an error
よく考えると、imread()の第1引数はファイル名なので、画像データを渡してもエラーになるのは当たり前でした。imread()の代わりに、DBから取り出したデータをnumpyのfrombuffer()とOpenCVのimdecode()で変換を行うと、imread()を利用した場合と同様にjpegをOpenCVで利用できるようになりました。正しく動いた例
import os,sys
import sqlite3
import cv2
import numpy as np
DBPATH='database.sqlite'
# db connect
if os.path.exists(DBPATH):
connection = sqlite3.connect(DBPATH)
else:
print(DBPATH+' not found.')
sys.exit(1)
connection.row_factory = sqlite3.Row
connection.text_factory = bytes # これがないとエラーが出る:sqlite3.Error occurred: Could not decode to UTF-8 column
cursor = connection.cursor()
res = None
try:
cursor.execute('select * from ref_image')
res = cursor.fetchall()
except sqlite3.Error as e:
print('Error:', e.args[0])
connection.close()
dbimg = res[1]['image'] # imageはBlob形式
jpg = np.frombuffer(dbimg, dtype=np.uint8)
img = cv2.imdecode(jpg, cv2.IMREAD_COLOR)
cv2.imshow("view jpg from sqlite3 db",img)
cv2.waitKey(0)
cv2.destroyAllWindows()