ARマーカーの検出

カメラ映像を取り込む

OpenCV for UnityでARマーカーの検出を行う際、画像をMatクラスにする必要がある。
基のシステムでTelloのカメラ映像をオブジェクトのTextureに変換して表示していたため、

Texture →(TextureSender)→ Texture2D →(OpenCV for Unity)→ Mat

という手順で変換している。

  1. 画像をARマーカーの検出に送る用スクリプトを作成
  2. 以下のようにコードを変更

このスクリプトでは、オブジェクトのTextureをTexture2Dに変換し、さらにARマーカー検出するEstimateメソッドを呼び出している。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//独自の名前空間
using EstimateTargetTransform_OCVfU;

public class TextureSender : MonoBehaviour
{
    // CameraParaCal cameraPara;
    public EstimateTra estimater;
    Texture2D texture;
    Texture2D result;
    RenderTexture rt;
    Rect source;

    // Start is called before the first frame update
    void Start()
    {
        // cameraPara = new CameraParaCal();
        estimater = new EstimateTra();
    }
    public Texture2D ToTexture2D(Texture self)
    {
        var sw = self.width;
        var sh = self.height;
        var format = TextureFormat.RGBA32;
        result = new Texture2D(sw, sh, format, false);
        var currentRT = RenderTexture.active;
        rt = new RenderTexture(sw, sh, 32);
        Graphics.Blit(self, rt);
        RenderTexture.active = rt;
        source = new Rect(0, 0, rt.width, rt.height);
        result.ReadPixels(source, 0, 0);
        result.Apply();
        RenderTexture.active = currentRT;
        return result;
    }

    // Update is called once per frame
    void Update()
    {
        texture = ToTexture2D(GetComponent<Renderer>().material.mainTexture);
        estimater.Estimate(texture);
        Destroy(result);
        Destroy(rt);
    }
}
  1. スクリーンとなるオブジェクトにアタッチ

画像からARマーカーの検出

呼び出したEstimateメソッドでは、画像をTexture2DからMatへ変換しARマーカーの検出を行っている

public void Estimate(Texture2D texture)
    {
        Mat img = new Mat(texture.height, texture.width, CvType.CV_8UC3);
        Utils.texture2DToMat(texture, img);
        /*
         * ARマーカーの検知
         * 6cm四方だと2mぐらいまではっきり検知可能
         */
        Aruco.detectMarkers(img, dictionary, corners, ids, parameters, rejectedImgPoints);
        /* 以下略 */
    }
  • ARマーカーを検出する
    Aruco.detectMarkers(/*画像*/, /*ARマーカーの辞書*/,
                        /*ARマーカーの角(Out)*/,
                        /*ARマーカーのID(Out)*/,
                        /*検出のパラメータ*/,
                        /*異常検出用(Out)*/)
    
    ※第5,6引数は使っていないため与えなくても問題なく動作するとは思う(試していない)。createメソッドで検出のパラメータを設定しているがリファレンスに何も書いていないため、おそらくデフォルトのまま