LoginSignup
2
3

More than 5 years have passed since last update.

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

Posted at

概要

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取得プログラム実行

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

  • 全体画像
    1.png

  • カメラ取得画像
    2.png

  • コンソール画像
    3.png

まとめ

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

2
3
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
2
3