概要
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カメラを使いました。
#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を試すことができるので、とても楽しいです。また、間違っているところや、追加したほうがいい、こういう書き方の方がいいよ!という箇所がありましたら、お教え頂けるととても嬉しいです。