이전 글에서 마크를 인식하여 마크의 ID와 위치, 자세를 계산하였습니다. 이 마크인식 프로그램을 기반으로 로봇의 위치인식에 사용하기 위해 약간의 코드를 수정하고 있는데, 수정한 내용은 다음과 같습니다.
1. 로봇에 장착된 카메라가 정면을 바라볼 때, 마크가 바닥이나 로봇이 바라보는 방향의 좌우 벽면에 붙은 경우 심하게 찌그러지게 되는데, 이럴 때도 인식이 잘 되도록 사각형의 모양을 검사하는 제약 조건을 한 가지 없앴습니다.
2. 마커의 위치와 자세를 화면에 표시하는 부분을 추가하였습니다.
3. 의미를 파악하기 힘들게 작명된 함수 이름 몇 개를 제대로(?) 고쳤습니다.
그리고 마커 인식 과정에 대한 내용을 문서로 정리하였습니다.
소스코드를 첨부합니다.
마커 인식 프로그램을 실행하기 앞서 카메라 캘리브레이션 과정을 거쳐야 합니다.
* OpenCV Camera Calibration 프로그램:
카메라 캘리브레이션 과정에서 얻은 Distortion.xml 파일과 Intrinsics.xml 파일이 있어야 마커의 위치와 자세 계산이 제대로 됩니다. 이것 외에도 마커의 위치와 자세 계산에 영향을 미치는 것이 마커의 크기를 설정하는 부분입니다. 마커를 프린트로 출력하였다면 프린트 된 마커의 정확한 크기를 측정해서 marker_recogDlg.cpp 파일 내에 CMarkerDetection() 생성자에서 마커의 가로 세로 크기를 인자로 넘겨주어야 합니다.
BOOL Cmarker_recogDlg::OnInitDialog()
{
...
_camera = new CCamOpenCV();
_markRecog = new CMarkerDetection (0.146f, 0.146f);
...
}