ArUco Moduleで生成したマーカのIDを取得


概要

OpenCVのContribにあるArUco Moduleで生成したマーカのIDをコンソールに出してみました。マーカを生成した後、そのマーカ画像をWebカメラから取得し、画面内に表示されているマーカのIDをコンソールに出力しました。以下の手順では、マーカの生成からID取得プログラム及び実行を示します。Visual studioでArUco Moduleを使えるようにする手順は参考URLを示すので、その手順通りに進めれば使えるようになると思います。

実行環境

次に実行環境を示します。

Soft and Hard バージョン
Visual Studio 2017
OpneCV 4.0.0
OpenCVContrib 4.0.0

Visual studioでArUco Moduleを使えるようにする手順は次の参考URLがとても分かりやすかったです。

以下に示す大まかな流れは次の通りです。

  • マーカの生成
  • マーカID取得プログラム
  • マーカID取得プログラム実行

マーカ生成

ArUco Moduleのマーカ生成に関しては、以下のgithubに分かりやすく書いてあるプログラムを実行することで、生成できます。また、使用している関数の内容も簡単にかいてあるので、自分でちょこちょこいじる事ができると思います。

マーカID取得プログラム

次に作成したマーカID取得プログラムを示します。カメラはUSBカメラを使いました。

get_markers_id.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/aruco.hpp"

// Get MarkersID
void ShowMarkerIdsFunction(cv::OutputArray in) {
    std::vector<cv::Mat> marker_ids;
    in.getMatVector(marker_ids);
    std::cout << "Marker IDs : "<< std::endl;
    for (auto marker_ids : marker_ids) {
        std::cout << marker_ids << std::endl;
    }
}

int main(int argh, char* argv[])
{
    // Create Marker Dictionary, Type of marker : 7X7,1000
    const cv::aruco::PREDEFINED_DICTIONARY_NAME dictionary_name = cv::aruco::DICT_7X7_1000;
    cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(dictionary_name);
    std::vector<int> marker_ids;
    std::vector<std::vector<cv::Point2f>> marker_corners;
    int sum_ids = 0;
    cv::Mat web_camera_frame;
    cv::VideoCapture cap(1);

    // Confirm web camera connection
    if (!cap.isOpened())
    {
        printf("web camera : Bad Connection\n");
        return -1;
    }

    // Recognition MarkersID with ArUco
    while (cap.read(web_camera_frame))
    {
        // Detect markers
        cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
        cv::aruco::detectMarkers(web_camera_frame, dictionary, marker_corners, marker_ids, parameters);
        cv::aruco::drawDetectedMarkers(web_camera_frame, marker_corners, marker_ids);

        sum_ids = marker_ids.size();
        cv::imshow("from camera", web_camera_frame);

        // Show MarkerID and  sum of IDs in console
        ShowMarkerIdsFunction(marker_ids);
        std::cout << "sum IDs:" << sum_ids << std::endl;

        const int key = cv::waitKey(1);
        if (key == 'q'){
            break;
        }
        else if (key == 's'){
            cv::imwrite("Marker_ids_recognized.png", web_camera_frame);
        }
    }
    cv::destroyAllWindows();
    return 0;
}

マーカID取得プログラム実行

実行したときのカメラ画像とコンソールの状態を次に示します。

  • 全体画像

  • カメラ取得画像

  • コンソール画像

まとめ

ArUco Moduleは簡単にARを試すことができるので、とても楽しいです。また、間違っているところや、追加したほうがいい、こういう書き方の方がいいよ!という箇所がありましたら、お教え頂けるととても嬉しいです。