PythonでARマーカー認識

PythonでARマーカー認識してみる

最終的には画像内の４隅に配置されているARマーカーを検出して、
その中のを台形補正して表示するようなことをやりたい。

まずはじめにARマーカーの認識だけ挑戦してみる。

こちらのブログを参考にさせていただきました。
http://okatenari.com/2017/11/28/python-ar/

参考というか、まずはほぼコピーで動作を確認してみます。


まずはマーカーの生成

```ruby: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](https://qiita-image-store.s3.amazonaws.com/0/7399/81e0042f-ab92-047a-9e4c-bbf40b3e0b4f.png)


カメラからARマーカーを検出する。
こちらは参考先からほぼ完全にコピー。

```python: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](https://qiita-image-store.s3.amazonaws.com/0/7399/1773dd13-9b41-e570-32f7-1ffc8102fbde.png)

多少傾けていても認識されます。
![2018-03-29 (1).png](https://qiita-image-store.s3.amazonaws.com/0/7399/9e2bcf5f-9f33-ece8-c322-251e662487ed.png)





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

```python: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](https://qiita-image-store.s3.amazonaws.com/0/7399/684daa1b-abae-6d74-b747-f23ce7df484b.png)

結果はこうなった
![result.png](https://qiita-image-store.s3.amazonaws.com/0/7399/269df512-6ab9-e690-73a4-8ec5b950ccb5.png)


検知できました。


QRコード（テキスト）でも試してみる
カメラ内にあるQRコードのテキストを読み取り、出力させます

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



```