ArUco의 다이아몬드 마커를 사용해보십시오 (C++)
소개
AruCo라는 AR 마커 라이브러리가 있지만, 일본어 기사는 모두 Python + OpenCV에서 간단한 마커를 검출하는지, 캘리브레이션 처리 방법 정도밖에 기사가 없었다. 이번에는 마커의 자세 추정의 정밀도 향상을 도모하기 위해 다이아몬드 마커를 사용하기에 이르렀지만, 다이아몬드 마커에 관한 일본어 기사가 거의 없었기 때문에, 비망록도 겸해 다이아몬드 마커가 어떤 것인지로부터 다이아몬드 마커의 검출 까지를 쓴다.
환경
사용한 환경은 다음과 같습니다.
사용한 환경은 다음과 같습니다.
다이아몬드 마커란?
3x3 체스보드 + ArUco 마커 4개로 만들어진 마커, 위 이미지에서 하나의 마커로 취급한다. 특징으로서 이하를 들 수 있다.
마커 만들기
마커를 만드는 함수가 <opencv2/aruco/charuco.hpp>
안에 있기 때문에 그것을 사용합니다.
Python 환경에서는 pip install opencv-python
와 pip install opencv-contrib-python
에서 ArUco 를 사용할 수 있게 되지만, 그 경우는 이하의 drawCharucoDiamond
를 사용할 수 없었다. (소스에서 빌드한 것을 사용하면 할 수 있을지도 모르지만 미확인)
또, OpenCVForUnity에서도 실행을 할 수 없었기 때문에 주의.
createmarker.cppcv::aruco::drawCharucoDiamond(dictionary, cv::Vec4i(45,68,28,74), 200, 120, markerImage);
// 引数
// dictionary マーカーの辞書
// ids ダイヤモンドマーカーに使用する4つのマーカーID
// squareLength ピクセル単位のチェスボードの辺の長さ
// markerLength ピクセル単位のArUcoマーカーの長さ
// img 出力画像、画像サイズは3*squareLength + 2*marginSizeになる
// marginSize 出力画像におけるピクセル単位のマージンのサイズ
// borderBits マーカーの境界線の幅
마커 감지
마커의 검출은 일단 통상의 ArUco 마커를 검출하고 나서 다이아몬드 마커인지를 판정하는 검출을 행한다.
detectmarker.cpp// 通常のArUcoマーカー検出
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds);
// 検出されたマーカーのコーナーとIDを使ってダイヤモンドマーカーの検出を行う
cv::aruco::detectCharucoDiamond(inputImage, markerCorners, markerIds, squareLength / markerLength, diamondCorners, diamondIds);
// 引数
// image 入力画像
// markerCorners detectMarkersで取得したCorners
// markerIds detectMarkersで取得したIds
// squareMarkerLengthRate マーカ―サイズとチェスボードの辺の長さの比率、squareLength / markerLengthで計算できる
// diamondCorners Cornersの出力
// diamondIds Idsの出力、1つのダイヤモンドマーカーにつき4つのIdが出力される
// cameraMatrix カメラ行列
// distCoeffs 歪み係数
다이아몬드 마커를 취득해, drawAxis로 축까지 표시한 것이 이하가 된다.
Reference
이 문제에 관하여(ArUco의 다이아몬드 마커를 사용해보십시오 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sugurunatsuno/items/082a3cf0ae4f86b17580
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
cv::aruco::drawCharucoDiamond(dictionary, cv::Vec4i(45,68,28,74), 200, 120, markerImage);
// 引数
// dictionary マーカーの辞書
// ids ダイヤモンドマーカーに使用する4つのマーカーID
// squareLength ピクセル単位のチェスボードの辺の長さ
// markerLength ピクセル単位のArUcoマーカーの長さ
// img 出力画像、画像サイズは3*squareLength + 2*marginSizeになる
// marginSize 出力画像におけるピクセル単位のマージンのサイズ
// borderBits マーカーの境界線の幅
마커의 검출은 일단 통상의 ArUco 마커를 검출하고 나서 다이아몬드 마커인지를 판정하는 검출을 행한다.
detectmarker.cpp
// 通常のArUcoマーカー検出
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds);
// 検出されたマーカーのコーナーとIDを使ってダイヤモンドマーカーの検出を行う
cv::aruco::detectCharucoDiamond(inputImage, markerCorners, markerIds, squareLength / markerLength, diamondCorners, diamondIds);
// 引数
// image 入力画像
// markerCorners detectMarkersで取得したCorners
// markerIds detectMarkersで取得したIds
// squareMarkerLengthRate マーカ―サイズとチェスボードの辺の長さの比率、squareLength / markerLengthで計算できる
// diamondCorners Cornersの出力
// diamondIds Idsの出力、1つのダイヤモンドマーカーにつき4つのIdが出力される
// cameraMatrix カメラ行列
// distCoeffs 歪み係数
다이아몬드 마커를 취득해, drawAxis로 축까지 표시한 것이 이하가 된다.
Reference
이 문제에 관하여(ArUco의 다이아몬드 마커를 사용해보십시오 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sugurunatsuno/items/082a3cf0ae4f86b17580텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)