# 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 적용 없습니다. 그냥, 절반씩 합성합니다.