본문 바로가기

[ 프로그래밍 ]/강좌

OpenCV 강좌 04. 영상 이진화 하기

AR을 시작하면서 처음 떠오른 것이 바로, 해리포터에 나오는 신문(예언자 일보?)이다.


얼핏보면 일반 신문과 다를바 없는 신문이지만, 신문의 사진들은 사진이 아닌 동영상이다.
AR 첫 주제로 해리포터 신문, 일명 멀티미디어 신문을 만들어보고자 한다.

원리 자체는 간단하다.
종이에 기사를 프린트하되, 영상이 들어갈 부분은 2D 마커로 대치한다.
캠이 기사를 비출 때 마커를 인식하여 그 마커 위에 영상을 뿌려주는 것이 과제의 전부이다.


본 장에서는 OpenCV를 이용하여 영상을 이진화하는 방법에 대해 살펴본다.




1. 버튼 만들기
- 체크박스를 하나 추가한다. (Push Like를 True로 두는 것은 단지 내 스타일일 뿐 다른 의미는 없다.)

2. 변수 추가
- 이진화 버튼이 체크 여부를 확인할 수 있도록 변수 설정

3. 클릭 이벤트의 처리
- 이진화 영상은 다이얼로그에 출력하지 않고 새로 윈도우를 생성하여 보여주도록 한다.

4. 타이머 내부 수정
- 이진화를 선택해둔 경우에만 영상을 이진화 하여 화면에 출력한다.

IplImage 타입의 영상을 이진화 하기 위해 사용하는 함수는 cvThreshold라는 함수이며,
이는 입력으로 들어가는 영상의 각 채널을 이진화 한다.
이런 이유로 컬러영상(3개 채널)을 이진화 하는 경우, R, G, B 각각을 이진화 하기 때문에
아래와 같이 의도하지 않은 영상을 얻게 될 수도 있다.



그런 이유 때문에 이진화 전에는 cvCvtColor()를 이용하여 Gray로 변환 후 이진화 한다.
cvCvtColor()의 세 번 째 인수는 어떤 컬러맵으로 변환할 것인지 선택할 수 있으며,
OpenCV에서 제공하는 방법들은 CV_BGR2GRAY 뿐만 아니라 
CV_BGR2YCrCb, CV_BGR2HSV, CV_BGR2Lab 등 여러가지이며 이는 cv.h 파일에서 확인할 수 있다.


cvThreshold() 함수는 실제로 이진화를 수행하는 함수로,
세 번 째 인수는 문턱치를 설정하고,
네 번 째 인수는 문턱치를 넘어선 픽셀들을 어떤 값으로 설정할 것인지를,
다섯 번 째 인수는 이진화 알고리즘을 선택할 수 있다.



5. 결과