openCV를 이용해서 간단한 화면 전환 방법을 소개한다...

간단히 cvFlip() 함수를 쓰면 된다...

cvFlip 함수 원형은 다음과 같다..

cvFlip( const CvArr* src, CvArr* dst CV_DEFAULT(NULL),
                     int flip_mode CV_DEFAULT(0));

먼저 첫번째 파라미터에 현재 이미지, 두번째가 변환 후 저장될 이미지를 넣으

면 되고, 마지막, 파라미터를 0을 넣으면 상하 반전, 1을 넣으면 좌우 반전이다.


위의 사진이 0을 넣은 상하반전

,


위의 사진이 1을 넣은 좌우 반전 이다..

두 사진 모두 왼쪽이 원본이고, 오른쪽이 변환된 화면이다..
Posted by 바람처럼..
|

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

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

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

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

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

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

이전 포스팅 보기.

이진화 함수는..

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 바람처럼..
|

흠.. 작업환경이 윈도우 7이고, 2010을 쓰며 OpenCV 2.2를 사용하여 작업을 하려 했는데...

큰 걸림돌이 발생했다...............

기본 적인 웹캠 입력 소스를 작성하였는데, 웹캠이 전혀 아무 동작을 안하는 것이다..

웹캠은 ms hd-3000을 이용했었는데,

드라이버 설정이 잘못 된 것인지, 아예 값도 안들어 오는 것이였다....

한참을 붙잡고 있다가, 불현듯 스치는 생각이 혹시 윈도우 7 때문이였을까 하여, 같은 소스를 릴리즈로 뽑아...

xp를 쓰고 있는 다른 회사 사람 컴퓨터에서 실행했더니... 된다 - _-;;;;;;

흠.. 그래서 openCV 카페부터 구글 까지 쭉 검색해 봤더니..

의외로.. 이런 경우가 많단다 ;;;

이유는 정확히 모르지만, 윈도우의 종류나, 웹캠의 종류나, 쓰는 소스의 방식 등의 문제들로 호환이 잘 안된다고

한다..

어쩃든 웹캠은 입력 받아야 하니... 부랴부랴 directshow를 이용해서 입력받았다...

그 이유도 카페의 한 글에서 경력자이신 듯한 분께서, openCV를 통한 입력은 여러가지 호환 문제가 있으니,

기본적인 입력은 directshow를 이용하면 좋다... 고 하는 글을 보았다...

혹시 이 문제가 생기신 분들은 안정성을 위해서라도 directshow로 입력받고 후처리에서 openCV를 쓰시는 방법을 추천한다..

directshow로 입력 받는 방법은

다른 포스팅 글에서 클래스를 추가해뒀으니, 그것만 받고 기본 예제만 실행해 보시면 금방 할 수 있을 듯 하다....
Posted by 바람처럼..
|


설치 방법 및 셋팅은 이전 포스트 참고.

이제 설치도 끝났고, 셋팅도 끝났으면 openCV를 이용하여 영상을 입력 받으면 된다...

#include <cv.h>
#include <highgui.h>

void main()
{
         IplImage* image = 0; //openCV에서 사용되는 자료형이다.
 
         CvCapture* capture = cvCaptureFromCAM(0); //현재 인식된 웹캠을 찾고,
         cvNamedWindow( "OpenCvCamtest", 0 ); // 화면을 그려줄 윈도우를 생성한다.

         cvResizeWindow( "OpenCvCamtest", 640, 480 ); // 사이즈를 조절한다.(lpIImage를 할당하면서도 조절가능)

         while(1) {
         cvGrabFrame( capture );
         image = cvRetrieveFrame( capture ); // 현재 인식된 장면을 받아오고image에 넣는다.

         cvShowImage( "OpenCvCamtest", image ); // image에 있는 장면을 윈도우에 그린다.

         if( cvWaitKey(10) >= 0 ) // 이게 가장 중요한데 이 WaitKey 함수가 없으면 아무 것도 안그린다.
                break;
         }

         cvReleaseCapture( &capture ); // 할당받았던 웹캠을 해제하고,
         cvDestroyWindow( "OpenCvCamtest" ); // 윈도우를 종료한다.
}

이게 기본적인 소스이다..

위의 소스를 입력하면 바로,


위와 같은 화면이 나온다...

일단 아무 처리도 하지 않은 상태의 캡쳐된 화면이 나온다...

소스는 대충 주석이 달린 의미대로 생각하면 되고,

위에 중요하다고 적은 cvWaitKey()에 대해서 알아보면,

파라미터로 들어가는 숫자는 밀리세컨드 시간으로 10 이면 0.01초를 말한다.

이 시간동안 키 입력 값이 없으면 진행된다는 의미로 보면된다..

그 시간 내에 키가 입력되면 true가 되면서 break 문을 만나 프로그램이 종료된다...

이제 openCV 걸음마 수준인데.. 점점 한가지씩 영상처리 기법들을 알아가며, 최종적으로는..

크로마키 배경 없이 배경 제거를 하는 정도를 목표로 꾸준히 공부해 가야겠다...

Posted by 바람처럼..
|

얼마전부터 영상처리쪽 관련하여 작업을 좀 하다보니,

흠.. 조금이라도 깊이 파고 들어 공부를 해볼 필요성이 있다고 생각이 되었다...

회사에서는 2010에 2.2 버전을 사용했지만,

머 딱히 집에서 공부용이라, 2008에 2.1 버전으로 설치하였다...

머 일단은 웹캠이 필요하니, 인터넷으로 저가형 웹캠을 하나 구입하였다...

먼저 설치 방법은,

다른 분들은 컴파일을 하고 파일을 복사하고, 이런 방법을 쓰던데..

나는 그냥 편하게 설치 파일을 가지고 설치하였다..


설치 파일 링크

위의 경로로 가면 바로 설치 파일 다운이 된다....

먼저 받은 실행파일을 실행하고, 다음 다음 해서 설치를 끝내면 기본 경로는 c:\ 에 openCV 2.1 폴더에 설치가 된다...

이 것을 기준으로 설명하면..

먼저 프로젝트를 생성한다.

콘솔로 생성하고 빈 프로젝트로 만든다...

그리고 사진이 안보이면 클릭하면 크게 보임.



위와 같이 옵션 창에서 포함 파일에 경로를 추가하고,


라이브러리도 똑같이 추가한다.

 


그리고 프로젝트 -> 속성 -> 링커 -> 입력 -> 추가 종속성에 

cv210d.lib highgui210d.lib 2개의 라이브러리를 추가한다. 

뒤에 d 가 붙은 lib 파일은 디버그용 릴리즈용은 d를 제거하면 된다...

그리고 프로젝트의 폴더 안에 cv210d.dll highgui210d.dll cxcore210d.dll 를 추가한다. 혹은 system32 폴더에 추가하면 된다..

이렇게 하면 기본적인 셋팅은 끝난다.

이제 소스만 추가하면 영상처리의 첫 발을 내딛을 수 있다...


Posted by 바람처럼..
|