python3でsqlite3のDBからjpegを読み出してOpenCVで利用する

2020年1月27日月曜日

Linux Python

t f B! P L
sqlite3のDBにBlobとして登録済みのjpegデータを取り出して、OpenCVのimread()に渡すと次のようなエラーが出ました。

ソースコード

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()

このブログを検索

ブログアーカイブ

QooQ