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 버전을 의미합니다. 상황에 맞는 버전을 사용하시면 됩니다.
구성속성 → 링커 → 일반 → 추가 종속성
에 opencvts300.lib opencvworld300.lib
를 추가합니다.
이 예시에서는, opencv 3.0 버전을 사용하였습니다.
작성
소스 파일에 main.cpp 파일을 추가합니다. opencv.jpg 라는 이미지 파일을 복사합니다.
코드를 입력하고 실행합니다.
#include <opencv\cv.h> #include <opencv\highgui.h> int main(void ) { char* filePath = "C:\\프로젝트경로\\OpenCV\\ConsoleApplication3\\Debug\\opencv.jpg" ; IplImage* image = cvLoadImage(filePath); cvShowImage( "OpenCV", image); cvWaitKey(0); cvReleaseImage(&image); return 0; }
기본 익히기
사각형 그리기
제공 함수
<sxh cpp>
rectangle(image, Point(0,0), Point(w, h), Scalar(0,0,255), -1, 8);
</sxh>
포인트 또는, Rect로 위치를 지정하고, Scalar 로 색상을 정의하면 사각형이 생깁니다.
연습으로 비슷하게 구현한 코드입니다.
<sxh cpp>
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 <<":"<<rt.y<<":"<<rt.width<<":"<<rt.height<<endl ; for (int i = rt.x ; i < rt.width ; i++){ for (int j= rt.y; j< rt.height; j++){ for (int k=0; k < c; k++){ mat->data[j*w*c+i*c+k] = sc.val[k]; } } }
}
</sxh>
그냥 3차원 배열로 접근하면 되지 않을까… 하는 생각을 해봅니다..
화면 뒤집기
제공함수는 아래와 같습니다.
<sxh cpp>
flip(image, image, 0);
</sxh>
0 은 상하, 1은 좌우, -1은 상하좌우로 화면을 뒤집습니다.
비슷하게 구현한 코드입니다.
<sxh cpp>
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<h; i++){ for (int j=0; j < w; j++){ for (int k=0; k <c; k++){ if (type == 0){ rst.data[k+ c*j + c*w*(h-i-1)] = mat.data[k+ c*j + c*w*i]; }else if (type == 1){ rst.data[k+ c*(w-j-1) + c*w*i] = mat.data[k+ c*j + c*w*i]; }else if (type == -1){ rst.data[k+ c*(w-j-1) + c*w*(h-i-1)] = mat.data[k+ c*j + c*w*i]; } } } } return rst;
}
</sxh>
화면 합성
제공 함수
<sxh cpp>
addWeighted(mat, 0.5, bg, 0.5, 1, mat, -1);
</sxh>
alpha 값을 변경하여 합성할 수 있습니다.
연습용 코드
<sxh cpp>
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;
}
</sxh>
alpha 적용 없습니다. 그냥, 절반씩 합성합니다.