이전 글에서 마커의 영역을 추출하고 탬플릿 매칭으로 마커를 인식하는 것까지 수행해 보았습니다. 여기서는 이전 프로그램에서 마커를 탐지하는 과정을 조금 손보고, 탐지한 마커를 구분하는 방법을 개선하기 위해서 마커 내부에 코드를 부여하여 마커를 서로 구분하도록 하였습니다. 이전 프로그램과 비교했을 때, 마커를 탐지하고 구분하는데 어느정도 만족할 만한 결과를 얻었기에 결과를 다시 블로그에 올리게 되었습니다. 이제 마커를 벽에 붙이고 로봇의 위치를 인식하기 위해 Kalman filter와 결합하는 일만 남았습니다.
이 프로그램은 카메라에서 바라본 마커의 위치와 자세를 계산하기 위하여 카메라 캘리브레이션 파라메터를 이용합니다. 카메라 캘리브레이션과 파라메터를 얻는 방법은 카메라 캘리브레이션 글을 참조하시기 바랍니다. 카메라 캘리브레이션 결과로 얻어진 Intrinsics.xml 파일과 Distortion.xml 파일이 제대로 설정되어 있어야 올바른 결과를 얻을 수 있습니다.
마커 인식에 대한 코드는 MarkerRecog.h/cpp 파일에 구현되어 있으며, 코드 내에 상세히 주석을 달아놓았기에 여기서 따로 설명은 하지 않겠습니다. 따로 언급해야할 부분으로는 마커를 인식하였을 때 크기를 등록하는 부분으로, FindMarkerInContour() 함수에 실제 마커의 크기를 설정해야 하는 부분이 있습니다.
sMarkerInfo mi;
mi.width = 0.141f; // 실제 마커의 가로 길이 (단위: m)
mi.height = 0.141f; // 실제 마커의 세로 길이 (단위: m)
mi.ID = -1; // -1로 초기화
여기서 width와 height를 마커의 크기에 따라 적절히 설정해 주면 됩니다.
그리고 마커의 외곽선을 인식하였을 때, 이 외곽선이 우리가 찾는 사각형 박스인지 검사하기 위해서 사각형의 두 대각선의 교차점을 구하는 부분이 있습니다. 이 부분에 대한 설명은 다음 문서를 참고하십시오.
또한, 마커를 어떻게 만드는지는 다음 문서를 참고하시기 바랍니다.
VS 2008 프로젝트 파일: OpenCV 2.31., Eigen 라이브러리를 사용합니다.
아래 동영상에서 마커 인식 결과를 확인하시기 바랍니다.