본문 바로가기

카테고리 없음

OpenCV Marker Detection

마커 인식은 증강현실과 같은 분야에서 다양하게 사용되고 있는것으로 알고있습니다. 여기서는 로봇의 위치인식에 사용하기 위해 마커 인식 테스트 코드를 개발하던 중 어느정도 결과가 나와 블로그에 공개하게 되었습니다.

로봇이 주행 중 자신의 위치를 알기 위해서는 벽이나 천정의 마커를 인식하여 마커의 위치로부터 상대적으로 로봇의 위치를 추정하게 됩니다. 그래서 먼저 마커를 인식 하는 프로그램을 만들게 되었습니다. 동영상에서와 같이 아직은 인식률이 좋지 않습니다.

 

마커의 테두리를 인식하는 과정은 다음과 같습니다:

  1. 입력 영상을 흑백으로 변환한 후 threshold 값을 적용하여 바이너리 이미지로 만듭니다.
  2. 컨투어를 찾습니다. 여기서 검은색 사각형의 테두리를 인식하게 되는데, 사각형이 사각형을 포함하면서 각각 4개의 꼭지점을 가지고 있다면 일단 마커의 테두리 후보가 됩니다.
  3. 2번 과정에서 찾은 후보들 중에서 내부와 외부의 사각형 모양이 동일한지 비교합니다. 외부의 사각형에서 두 대각선을 긋고 내부의 사각형의 모서리 점이 이 대각선 상에 배치되는지 검사하여, 대각선 근처에 모서리 점이 있다면 마커의 테두리로 확정합니다.
    이제 내부 사각형에 있는 이미지와 미리 등록되어 있는 이미지의 유사도를 비교합니다. 이를 위해 미리 DB에 비교되어질 이미지를 읽어들여 놓고 컨투어도 찾아 놓습니다.
  4. 내부 사각형의 4개의 꼭지점을 (0,0), (0,100), (100,100), (100,0)으로 매핑 하기 위한 변환 행렬을 계산합니다.
    실제로는 타겟을 약간 크게 지정합니다. 왜냐하면 잘라낸 이미지에서 검은색 테두리가 보일 수 있기때문입니다.
  5. 4에서 구한 변환 행렬로 내부 사각형을 100x100 이미지로 복사합니다.
  6. 5에서 만든 이미지에서 컨투어를 찾습니다.
  7. 이제 DB에 있는 이미지의 컨투어와 6에서 찾은 컨투어를 하나씩 매칭합니다.
  8. DB에서 가장 매칭 률이 높은 이미지를 인식된 이미지로 선택하게 됩니다.

아래 소스코드를 첨부합니다. 소스코드는 VisualC++ 2008로 작성되었습니다.

marker_extraction2.zip
0.13MB

 

아래는 실행 동영상입니다.

 

오른쪽 상단 텍스트가 DB의 이미지와 메칭되는 비율이고, 오른쪽 중간의 작은 윈도우에는 매칭된 이미지를 표시하고, 오른쪽 하단의 작은 윈도우에는 화면에서 추출한 마커를 표시합니다.