LoginSignup
32
42

More than 3 years have passed since last update.

PythonでARマーカー認識

Last updated at Posted at 2018-02-18

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.png

カメラから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()

実行結果。
2018-03-29 .png

多少傾けていても認識されます。
2018-03-29 (1).png

カメラがない環境の場合は直接画像から読み込んで確認してみる

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

このような画像を作ってみて、
test.png

結果はこうなった
result.png

検知できました。

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() #すべてのウィンドウを閉じる



32
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
42