ArUco의 다이아몬드 마커를 사용해보십시오 (C++)

4391 단어 C++WindowsArUcoOpenCV

소개



AruCo라는 AR 마커 라이브러리가 있지만, 일본어 기사는 모두 Python + OpenCV에서 간단한 마커를 검출하는지, 캘리브레이션 처리 방법 정도밖에 기사가 없었다. 이번에는 마커의 자세 추정의 정밀도 향상을 도모하기 위해 다이아몬드 마커를 사용하기에 이르렀지만, 다이아몬드 마커에 관한 일본어 기사가 거의 없었기 때문에, 비망록도 겸해 다이아몬드 마커가 어떤 것인지로부터 다이아몬드 마커의 검출 까지를 쓴다.

환경



사용한 환경은 다음과 같습니다.
  • Windows 10 Home
  • OpenCV 4.1.1 (소스로부터 빌드한다, opencv_contrib도 빌드하는 것)
  • Visual Studio 2019

  • 다이아몬드 마커란?





    3x3 체스보드 + ArUco 마커 4개로 만들어진 마커, 위 이미지에서 하나의 마커로 취급한다. 특징으로서 이하를 들 수 있다.
  • 4 개의 마커 ID를 사용하기 위해 하나의 사전에서 더 많은 마커를 만들 수 있습니다 (100 개의 사전이라면 100 ^ 4 개)
  • 체스 보드를 사용하기 때문에 정확한 자세 추정을 할 수 있습니다

  • 마커 만들기



    마커를 만드는 함수가 <opencv2/aruco/charuco.hpp> 안에 있기 때문에 그것을 사용합니다.
    Python 환경에서는 pip install opencv-pythonpip install opencv-contrib-python 에서 ArUco 를 사용할 수 있게 되지만, 그 경우는 이하의 drawCharucoDiamond 를 사용할 수 없었다. (소스에서 빌드한 것을 사용하면 할 수 있을지도 모르지만 미확인)
    또, OpenCVForUnity에서도 실행을 할 수 없었기 때문에 주의.

    createmarker.cpp
    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로 축까지 표시한 것이 이하가 된다.

    좋은 웹페이지 즐겨찾기