입력 받은 화면으로 무언가 처리를 하기 앞서서.. 가장 필요한 것이 이진화 인 것 같다...

물론 이진화 없이 바로 처리를 하여도 되지만, 이진화를 하지않고 바로 처리를 하게 된다면,

예상되는 조건들이 너무 많아진다...

이 모든 것들이 이진화를 함으로 해서 흑이냐 백이냐만 판단하면 된다...

(물론, 이진화를 하면서 잃는 부분도 있겠지만, 장점이 더 큰 듯하다. )

일단 기본적인 셋팅은 웹캠 입력과 동일하고 이진화 함수만 추가하였다...

이전 포스팅 보기.

이진화 함수는..

cvThreshold(const CvArr*  src, CvArr*  dst, double  threshold, double  max_value, int threshold_type) 라는 함수이다..

파라미터의 순서대로 이진화를 시킬 영상, 이진화가 된 후 저장될 영상, 경계가 되는 수치값, 그 것을 넘은 수치를 설정하는 값,

그리고 마지막으로 이진화 방식을 설정한다...

이진화 방식은 CV_THRESH_OTSU 으로 많이 하는데.. 그 외에도

#define CV_THRESH_BINARY      0  /* value = value > threshold ? max_value : 0       */
#define CV_THRESH_BINARY_INV  1  /* value = value > threshold ? 0 : max_value       */
#define CV_THRESH_TRUNC       2  /* value = value > threshold ? threshold : value   */
#define CV_THRESH_TOZERO      3  /* value = value > threshold ? value : 0           */
#define CV_THRESH_TOZERO_INV  4  /* value = value > threshold ? 0 : value           */
#define CV_THRESH_MASK        7

이런 정의가 더 있다...

그리고, 이진화를 하려면 단일 채널을 만든 후, gray 변환을 해야한다...

지금처럼 RGB를 모두 추가하여 실행을 하면, 프로그램이 죽는다 ;;;

그래서 간단히 gray라는 이미지 공간을 하나 더 만들고,

gray =  cvCreateImage( cvSize(640,480), 8 , 1) ; 로 이미지를 만든다..

여기서 사이즈는 받아올 이미지와 같아야 하고, 뒤의 1은 채널 수 인데 1로 설정한 건 단일 채널이란 뜻이다. 그다음.

cvCvtColor( const CvArr* src, CvArr* dst, int code ); 이 함수를 통하여, 색 공간을 변형 시켜 주면된다...

마지막 code는 F12로 따라가 보면, 많은 종류가 있는데 오늘은 이진화기 때문에, CV_BGR2GRAY 를 이용한다.

그렇게 해서 컴파일하면...


이런 화면이 나온다... 왼쪽이 원본 화면, 오른쪽이 이진화 화면이다.. 조명의 영향에 따라서..

또 색이 쉽게 바뀌는데 이것은 전혀 처리를 안한 것이기 때문에 또 여러가지 처리를 통해서 노이즈 제거라든지, 이런게 필요하다..

아래의 사진이 오늘 추가된 소스의 전부이다...



자세한 설명은 본문에 있기 때문에, 생략하고, 사진이 안보이면 클릭하면 크게 보인다...


Posted by 바람처럼..
|