# OpenCV + Visual Studio ## 설치 OpenCV 윈도우용 다운로드. 홈페이지 : http://opencv.org/ 윈도우용 파일을 다운로드 받고, 압축을 풉니다. 빌드된 파일을 사용합니다. 빌드된 파일의 경로는 /opencv/opencv/build/x86/ 입니다. x64, x86 두가지로, 64비트, 32비트 파일이 있는데, 이 중에서 32비트를 사용합니다. 해당 폴더에는 vc11, vc12 두가지가 있습니다. vc11 은 Visual Studio 2012 vc12 는 Visual Studio 2013 용 입니다. 비주얼 스튜디오 버전에 맞게 사용하시면 됩니다. ## 설정 비주얼 스튜디오를 실행합니다. C++ 프로젝트를 생성합니다. 콘솔로, 빈 프로젝트를 생성합니다. 프로젝트 → 속성 창을 엽니다. ''구성 속성 → C/C++ → 일반 → 추가 포함 디렉터리'' 에 ''opencv/opencv/build/include'' 경로를 추가합니다. ''구성 속성 → 링커 → 일반 → 추가 라이브러리 디렉터리'' 에 ''opencv/opencv/build/x86/vc11/lib'' 경로를 추가합니다. 여기서 x86은 32비트, vc11은 비주얼 스튜디오 2013 버전을 의미합니다. 상황에 맞는 버전을 사용하시면 됩니다. ''구성속성 → 링커 → 일반 → 추가 종속성'' 에 ''opencv_ts300.lib opencv_world300.lib'' 를 추가합니다. 이 예시에서는, opencv 3.0 버전을 사용하였습니다. ## 작성 소스 파일에 main.cpp 파일을 추가합니다. opencv.jpg 라는 이미지 파일을 복사합니다. 코드를 입력하고 실행합니다. #include #include int main(void ) { char* filePath = "C:\\프로젝트경로\\OpenCV\\ConsoleApplication3\\Debug\\opencv.jpg" ; IplImage* image = cvLoadImage(filePath); cvShowImage( "OpenCV", image); cvWaitKey(0); cvReleaseImage(&image); return 0; } # 기본 익히기 ## 사각형 그리기 제공 함수 rectangle(image, Point(0,0), Point(w, h), Scalar(0,0,255), -1, 8); 포인트 또는, Rect로 위치를 지정하고, Scalar 로 색상을 정의하면 사각형이 생깁니다. 연습으로 비슷하게 구현한 코드입니다. void drawRect(Mat* mat, Rect rt, Scalar sc){ //int h = mat->size().height; int w = mat->size().width; int c = mat->channels(); cout << "x, y, width, height " << rt.x <<":"<data[j*w*c+i*c+k] = sc.val[k]; } } } } 그냥 3차원 배열로 접근하면 되지 않을까... 하는 생각을 해봅니다.. ## 화면 뒤집기 제공함수는 아래와 같습니다. flip(image, image, 0); 0 은 상하, 1은 좌우, -1은 상하좌우로 화면을 뒤집습니다. 비슷하게 구현한 코드입니다. Mat flipData(Mat mat, int type){ int h = mat.size().height; int w = mat.size().width; int c = mat.channels(); Mat rst; rst.create(Size(w,h),CV_8UC3); for(int i = 0; i ## 화면 합성 제공 함수 addWeighted(mat, 0.5, bg, 0.5, 1, mat, -1); alpha 값을 변경하여 합성할 수 있습니다. 연습용 코드 Mat composeMat(Mat mat, Mat bg){ int h = mat.size().height; int w = mat.size().width; int c = mat.channels(); Mat rst; rst.create(Size(w,h),CV_8UC3); for (int i =0 ; i < h*w*c; i++){ rst.data[i] = mat.data[i]/2+bg.data[i]/2; } return rst; } alpha 적용 없습니다. 그냥, 절반씩 합성합니다.