この記事は以下のサイトを参考にしたものです.
https://zenn.dev/ijiwarunahello/articles/e1d26d393a02ec
opencvでQRコードを検出する
通常の方法では,以下のコードで,QRコードを検出する.
import cv2
import pyzbar.pyzbar
filename = "/path/to/image.png"
img = cv2.imread(filename)
res = pyzbar.pyzbar.decode(img)
print(res)
ただし,この方法では小さいQRコードが検出されないため,別の方法を考える必要がある.
WeChatQRCodeで小さいQRコードを検出する
小さいQRコードを検出するにはWeChatQRCodeを使うのが良い.
WeChatQRCodeはopencv-contrib-pythonをインストールしておく必要がある.
$ pip install opencv-contrib-python
また,以下のサイトから,wechat qrcodeを動かすために必要なファイルをダウンロードしておく必要がある.
https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode
以下の4つのファイル.
- detect.caffemodel
- detect.prototxt
- sr.caffemodel
- sr.prototxt
$ cd /path/to/store/files
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/detect.caffemodel
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/detect.prototxt
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/sr.caffemodel
$ curl -OL https://github.com/WeChatCV/opencv_3rdparty/raw/wechat_qrcode/sr.prototxt
以下のコードで,QRコードを検出する.
import cv2
filename = "/path/to/image.png"
img = cv2.imread(filename)
detector = cv2.wechat_qrcode.WeChatQRCode("/path/to/detect.prototxt", "/path/to/detect.caffemodel", "/path/to/sr.prototxt", "/path/to/sr.caffemodel")
img = cv2.cvtColor(cv2.COLOR_BGR2RGB)
data, points = detector.detectAndDecode(img)
print(data)
print(points) # QRコードの4隅の座標が格納されている