PythonでARマーカー認識してみる
最終的には画像内の4隅に配置されているARマーカーを検出して、
その中のを台形補正して表示するようなことをやりたい。
まずはじめにARマーカーの認識だけ挑戦してみる。
こちらのブログを参考にさせていただきました。
http://okatenari.com/2017/11/28/python-ar/
参考というか、まずはほぼコピーで動作を確認してみます。
まずはマーカーの生成
arMarker.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
def arGenerator():
fileName = "ar.png"
generator = aruco.drawMarker(dictionary, 0, 100)
cv2.imwrite(fileName, generator)
img = cv2.imread(fileName)
cv2.imshow('ArMarker',img)
cv2.waitKey(0)
arGenerator()
カメラからARマーカーを検出する。
こちらは参考先からほぼ完全にコピー。
arReaderByCamera.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
aruco = cv2.aruco #arucoライブラリ
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
def arReader():
cap = cv2.VideoCapture(0) #ビデオキャプチャの開始
while True:
ret, frame = cap.read() #ビデオキャプチャから画像を取得
Height, Width = frame.shape[:2] #sizeを取得
img = cv2.resize(frame,(int(Width),int(Height)))
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) #マーカを検出
aruco.drawDetectedMarkers(img, corners, ids, (0,255,0)) #検出したマーカに描画する
cv2.imshow('drawDetectedMarkers', img) #マーカが描画された画像を表示
cv2.waitKey(1) #キーボード入力の受付
cap.release() #ビデオキャプチャのメモリ解放
cv2.destroyAllWindows() #すべてのウィンドウを閉じる
arReader()
カメラがない環境の場合は直接画像から読み込んで確認してみる
arReaderByImage.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
aruco = cv2.aruco #arucoライブラリ
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
def arReader():
img = cv2.imread("test.png")
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) #マーカを検出
aruco.drawDetectedMarkers(img, corners, ids, (0,255,0)) #検出したマーカに描画する
cv2.imshow('drawDetectedMarkers', img) #マーカが描画された画像を表示
cv2.waitKey(0) #キーボード入力の受付
arReader()
検知できました。
QRコード(テキスト)でも試してみる
カメラ内にあるQRコードのテキストを読み取り、出力させます
qr.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pyzbar.pyzbar import decode
from PIL import Image
import cv2
cap = cv2.VideoCapture(0) #ビデオキャプチャの開始
while True:
ret, frame = cap.read() #ビデオキャプチャから画像を取得
Height, Width = frame.shape[:2] #sizeを取得
img = cv2.resize(frame,(int(Width),int(Height)))
PIL_Image=Image.fromarray(img)
cv2.imshow('Qr Test', img)
data = decode(PIL_Image)
# print(data[0][0].decode('utf-8', 'ignore'))
if(data != []):
print(data[0][0]) #何か読めていたら表示する
cv2.waitKey(1) #キーボード入力の受付
cap.release() #ビデオキャプチャのメモリ解放
cv2.destroyAllWindows() #すべてのウィンドウを閉じる