본문 바로가기

전체 글

OpenCV 이미지에 OpenGL 도형 표시하기 증강현실(augmented reality)를 구현하기 위해 카메라로 읽은 영상에 문자나 입체 도형들을 표시할 일이 있습니다. 처음에는 OpenCV 라이브러리를 사용해서 카메라로부터 영상을 읽어들이고, OpenGL로 배경을 투명하게 하여 영상 위에 입체 도형을 그리면 되지 않을까 생각하고 인터넷을 뒤져보았습니다. 그런데 참고할 만한 방법이나 소스를 검색하지 못했습니다. 그래서 OpenGL로 배경을 검게 하여 입체 도형을 그리고 도형만 따 낸 다음 OpenCV 이미지에 겹쳐 그리는 방법을 생각해 보았습니다. 다음 소스코드는 제가 생각한 방법에 대한 구현입니다. OpenCV 이미지에 OpenGL 도형을 그려야 할 경우 참고해 보시기 바랍니다. VC++ 2008로 작성한 코드: 소스코드에 대해 간단히 설명해 보.. 더보기
OpenCV Marker Recognition 2 이전 글에서 마크를 인식하여 마크의 ID와 위치, 자세를 계산하였습니다. 이 마크인식 프로그램을 기반으로 로봇의 위치인식에 사용하기 위해 약간의 코드를 수정하고 있는데, 수정한 내용은 다음과 같습니다. 1. 로봇에 장착된 카메라가 정면을 바라볼 때, 마크가 바닥이나 로봇이 바라보는 방향의 좌우 벽면에 붙은 경우 심하게 찌그러지게 되는데, 이럴 때도 인식이 잘 되도록 사각형의 모양을 검사하는 제약 조건을 한 가지 없앴습니다. 2. 마커의 위치와 자세를 화면에 표시하는 부분을 추가하였습니다. 3. 의미를 파악하기 힘들게 작명된 함수 이름 몇 개를 제대로(?) 고쳤습니다. 그리고 마커 인식 과정에 대한 내용을 문서로 정리하였습니다. 소스코드를 첨부합니다. 마커 인식 프로그램을 실행하기 앞서 카메라 캘리브레이션.. 더보기
회전 보간: 쿼터니언(Quaternion)을 사용한 Slerp(구면 선형 보간) 목차: 1. 오일러각과 회전행렬(Euler Angles and Rotation Matrix) - 2. 각속도(Angular Velocity)와 오일러각, 회전행렬 간의 관계 - 3. 쿼터니언(Quaternion)과 오일러각, 회전행렬 간의 관계 - 4. 회전 보간: 쿼터니언(Quaternion)을 사용한 Slerp(구면 선형 보간) - 쿼터니언 SLERP(spherical linear interpolation; 구면 선형 보간)은 두 개의 쿼터니언 사이에 보간된 쿼터니언들을 생성합니다. 이 쿼터니언들은 시작과 끝 쿼터니언을 최소의 변위로 연결하는 연속된 움직임을 만들 수 있습니다. 더보기
쿼터니언(Quaternion)과 오일러각, 회전행렬 간의 관계 목차: 1. 오일러각과 회전행렬(Euler Angles and Rotation Matrix) - 2. 각속도(Angular Velocity)와 오일러각, 회전행렬 간의 관계 - 3. 쿼터니언(Quaternion)과 오일러각, 회전행렬 간의 관계 - 4. 회전 보간: 쿼터니언(Quaternion)을 사용한 Slerp(구면 선형 보간) - 쿼터니언(Quaternion; 사원수)은 물체의 회전이나 방향 설정에서 뛰어난 성능을 발휘합니다.. 특히, 오일러 각(Euler Angles)의 연산에서 발생하는 짐벌락(Gimbal Lock)과 같은 각종 문제점들을 극복하기 위해 쿼터니언을 사용합니다. 그리고 9개의 원소를 사용하는 회전행렬에 비해 4개의 원소로 간결하게 표현할 수 있습니다. 내용: Quaternion E.. 더보기
각속도(Angular Velocity)와 오일러각, 회전행렬 간의 관계 목차: 1. 오일러각과 회전행렬(Euler Angles and Rotation Matrix) - 2. 각속도(Angular Velocity)와 오일러각, 회전행렬 간의 관계 - 3. 쿼터니언(Quaternion)과 오일러각, 회전행렬 간의 관계 - 4. 회전 보간: 쿼터니언(Quaternion)을 사용한 Slerp(구면 선형 보간) - 물체의 각속도(Angular Velocity)와 오일러 각(Euler Angles), 회전행렬(Rotation Matrix)간의 관계에 대하여 설명한 문서입니다. 내용: Angular Velocity Derivative of a Rotation Matrix Integration of Rotation Matrix Normalization of Rotation Matrix C.. 더보기
오일러각과 회전행렬(Euler Angles and Rotation Matrix) 목차: 1. 오일러각과 회전행렬(Euler Angles and Rotation Matrix) - 2. 각속도(Angular Velocity)와 오일러각, 회전행렬 간의 관계 - 3. 쿼터니언(Quaternion)과 오일러각, 회전행렬 간의 관계 - 4. 회전 보간: 쿼터니언(Quaternion)을 사용한 Slerp(구면 선형 보간) - 물체의 회전을 표현하기 위한 오일러 각(Euler Angles)와 회전행렬(Rotation Matrix)에 대하여 설명한 글입니다. 내용: Rotation Matrix Euler Angles Rotation Matrix and Small Angles Rotation Matrix to Euler Angles 더보기
두 점간의 거리와 유사도 판별 로보틱스를 공부하다보면 두 점간의 거리나 유사도를 판별해야 하는경우가 종종 생깁니다. 이 때 사용가능한 거리나 유사도를 측정하는 방법으로 유클리드 거리, 키(카이)제곱 거리, 마할라노비스 거리, 힐링거 거리 등이 사용되는데, 이에 대하여 간략히 소개합니다. 먼저 잘 알고있는 유클리드 거리(Euclidean distance)는 두 점간의 거리를 계산할 때 사용합니다. 예를 들자면, 로봇의 현재 위치가 P이고 목적지가 Q일 때 남은 거리를 계산하기 위해 유클리드 거리를 사용합니다. 마할라노비스 거리(Mahalanobis distance)는 위치인식이나 SLAM에서 서로 연관이 있는 특징점 간의 유사도를 계산할 때 사용합니다. 로봇이 주행하면서 천정의 형광등위치를 SLAM 하는 예를 들어보겠습니다. 로봇이 주.. 더보기
OpenCV Marker Recognition 이전 글에서 마커의 영역을 추출하고 탬플릿 매칭으로 마커를 인식하는 것까지 수행해 보았습니다. 여기서는 이전 프로그램에서 마커를 탐지하는 과정을 조금 손보고, 탐지한 마커를 구분하는 방법을 개선하기 위해서 마커 내부에 코드를 부여하여 마커를 서로 구분하도록 하였습니다. 이전 프로그램과 비교했을 때, 마커를 탐지하고 구분하는데 어느정도 만족할 만한 결과를 얻었기에 결과를 다시 블로그에 올리게 되었습니다. 이제 마커를 벽에 붙이고 로봇의 위치를 인식하기 위해 Kalman filter와 결합하는 일만 남았습니다. 이 프로그램은 카메라에서 바라본 마커의 위치와 자세를 계산하기 위하여 카메라 캘리브레이션 파라메터를 이용합니다. 카메라 캘리브레이션과 파라메터를 얻는 방법은 카메라 캘리브레이션 글을 참조하시기 바랍니.. 더보기