일단 OpenCV .3.4.0 을 다운받는다. 최신버전말고 본인의 샘플 코드에 맞는 버전을 받자.

https://opencv.org/releases.html


opencv



다운받은 파일을 실행해서 압축을 풀자.


opencv


그럼 아래와 같은 파일들이 나온다.


opencv


위 폴더 중 source 폴더는 말 그대로 opencv 의 모든 소스코드가 있는 폴더다. 어떤 원리로 동작하는지 알고싶거나 자기만의 라이브러리를 만들고 싶다면 source 폴더를 건드리면 되지만 cMake로 빌드가 되어있어서 Visual Studio 로 오픈하기 위해서는 또 다른 과정이 필요하다. 왠만하면 건드리지 말자. 


우리는 Visual Studio 2017 에 OpenCV를 가져다쓰는 것이 목적이기 때문에 build 폴더만 상관하면 된다.


build 폴더의 내용은 아래와 사진과 같다.


opencv


java, python 버전도 있는 것을 볼 수 있다. 당장은 C++로 사용할 것이기에 저 폴더들도 건드릴 필요가 없다. OpenCV 3.4.0 기준으로 x64 폴더를 보아 (64bit) 버전만 빌드가 된 것을 알수 있다. 따라서 우리에게 필요한 파일들은 헤더파일이 있는 include, 라이브러리와 dll이 있는 x64 뿐이다. 나머지 파일들은 cMake로 빌드하면서 생긴 파일드들이라 Visual Studio 2017 에서는 필요가 없다.


그럼 이제 Visual Studio 2017 에서 File > New > Project 를 통해 새 프로젝트를 만들도록 하자.


opencv


테스트 목적이니 그냥 이름은 아무거나 하고 C++ 중에 Empty Project 를 선택하자. 

그리고 프로젝트 폴더를 열어보자. 


opencv


Visual Studio 몇 부터였더라... 아무튼 2017은 내 문서 > Visual Studio 2017 폴더에 프로젝트 폴더가 있지 않고, 기본으로 설정된 위치가 바뀌어서 C:\사용자\(계정명)\source\repos 위치에 프로젝트 폴더가 생성된다.

위 사진에는 뭐가 많지만 빌드를 하지 않은 상태에서는 Opencv test (위에서 설정한 프로젝트 이름) 폴더 하나와 Opencv test.sln 파일만 있을 것이다.


여기서 Opencv test 폴더에 들어가자. 이 것이 프로젝트 폴더다.


opencv

위 사진은 이미 OpenCV에서 필요한 파일들을 가져오고 빌드도 한 번 진행한 상태라 뭐가 많지만 아마 처음에는 썰렁할 것이다. 그럼 이제 OpenCV 의 Build 폴더에서 필요한 파일들을 가져오도록 하자. 



opencv


우선은 헤더(.h) 파일들을 가져온다. 위 사진의 include 폴더를 위에서 생성한 프로젝트 폴더에 복사한다.



opencv


그리고 라이브러리 파일을 복사하기 위해 위 사진처럼 vs15 폴더의 lib 폴더도 복사한다. 우리는 Visual Studio 2017을 사용하기 때문에 vc15를 가져오지만, 혹시 Visual Studio 2015(맞나? 여튼 하나 전꺼)를 쓴다면 vc14 것을 가져오면 된다. 혹시 더 구버전을 사용한다면 아까 한 참위에서 이야기한 source 폴더에서 cMake 라는 빌더를 이용해서 목적에 맞게 빌드를 하면 되지만, 그 정도를 할 수 있는 분이라면 이런 글은 볼 필요도 없겠지.



opencv


마지막으로, dll 파일을 복사해오면 된다. 


즉, OpenCV의 모든 기능은 헤더(.h), 라이브러리(.lib), 동적 라이브러리(.dll) 에 모두 들어있다. 몇몇 기능들은 위 사진에서 추가하지 않은 opencv_ffmpeg340_64.dll 과 같은 기능들을 필요로하지만, 그 때가서 없다고 오류 뿜뿜 뜨면 추가하면되고 기본 기능은 opencv_world340.dll 에 모두 들어있다. 



opencv


그리고 다시 프로젝트 폴더를 보면 이런 모양이 되어있을 것이다. 물론 아직 Visual Studio 2017 상에서 빌드를 안해서 x64, Debug 같은 폴더는 없겠지만 상관없다. 


그럼 이제 Visual Studio 2017에서 프로젝트를 열어보자.


opencv


하나 위 폴더에서 Opencv test.sln 을 더블 클릭하면 된다. 참고로 .sln 은 솔루션의 약자인데 Visual Studio 2013 이었나? 그 쯤 이후로는 솔루션이라는 개념을 사용해서 그 안에 여러개의 프로젝트를 관리하는 형태로 바뀌면서 이런 모양이 되었다. 여튼 저거로 프로젝트를 실행한다고 기억하면 된다. 


opencv


프로그램이 실행되면 우측에 Solution Explorer 의 Source Files 폴더에서 우클릭을 하고 Add > New Item 을 들선택하자. 


opencv


테스트 목적이니 아무 이름으로 .cpp 파일을 만들면된다. 


그리고 만들어진 .cpp 파일을 더블 클릭해서 열고, 화면 중앙의 코드 영역에 샘플 코드를 입력한다. 본인이 작성한게 아니라 카메라(웹캠)을 통해 영상을 보여주는 여기저기 굴러다니는 평범한 샘플코드다. 


/**
@file videocapture_basic.cpp
@brief A very basic sample for using VideoCapture and VideoWriter
@author PkLab.net
@date Aug 24, 2016
*/
 
#include <opencv2\opencv.hpp>
#include <iostream>
#include <stdio.h>
 
using namespace cv;
using namespace std;
 
int main(intchar**)
{
    Mat frame;
    //--- INITIALIZE VIDEOCAPTURE
    VideoCapture cap;
    // open the default camera using default API
    cap.open(0);
    // OR advance usage: select any API backend
    int deviceID = 0;             // 0 = open default camera
    int apiID = cv::CAP_ANY;      // 0 = autodetect default API
                                  // open selected camera using selected API
    cap.open(deviceID + apiID);
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
 
    //--- GRAB AND WRITE LOOP
    cout << "Start grabbing" << endl
        << "Press any key to terminate" << endl;
    for (;;)
    {
        // wait for a new frame from camera and store it into 'frame'
        cap.read(frame);
        // check if we succeeded
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // show live and wait for a key with timeout long enough to show images
        imshow("Live", frame);
        if (waitKey(5>= 0)
            break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}
 
cs


일단은 테스트 목적이니 위 코드를 그냥 복붙하자. 참고로 웹에 있는 코드를 그냥 복붙하면 화면에 보이지 않는 개행문자 등이 껴서 오류를 낼 때가 있다. 메모장에 붙여넣기를 해서 이상한 문자가 중간에 껴있지 않은지 확인하고 Visual Studio 로 복사하는 습관을 들이자.


opencv


위와 같은 화면이 될 것이다. 


이제 프로젝트 폴더로 열심히 옮겨담은 OpenCV 요소들을 프로젝트에 추가해야한다. 폴더만 옮긴다고 끝이 아니다. 


opencv


솔루션말고 프로젝트에서 오른쪽 클릭을해서 속성(Properties) 에 들어가자. 


opencv


주의할 점은 지금 사용하는 OpenCV는 x64(64bit) 용 라이브러리이므로 맨 위에 Platform 설정을 꼭 x64로 해주어야 한다. 그 왼쪽에 Configuration 과 Platform 에 따라 각각 다른 옵션이 적용되기 때문이다. 지금은 테스트 목적이니 Debug, x64 설정으로 진행한다.


Visual Studio 2013 부터였나 따로 디렉터리를 지정하는 매뉴 (VC++ Directories) 가 생겼다. 예전처럼 귀찮게 C/C++, Linker 옵션에 일일이 들어가서 Include 폴더와 lib 폴더를 지정해줄 필요가 없어졌다.


우리는 헤더와 라이브러리만 추가할 것이므로 Include Directories 와 Library Directories 만 손보면 된다. dll 파일은 프로젝트 파일 (.vcxproj) 과 같은 폴더에 있거나, 프로그램을 독립적으로 실행할 경우 실행파일 (.exe) 과 같은 폴더에만 있으면 된다. 


opencv


경로를 클릭하면 오른쪽에 화살표가 뜨는데 화살표를 누르고 Edit을 선택해서 수정하면 된다.


opencv


위 사진과 같은 Edit 창에서 새 폴더 아이콘을 눌러 프로젝트 폴더로 복사한 Include 폴더를 선택해주자. 여기서 OpenCV가 설치된 폴더의 build > Include 폴더를 선택해줘도 되지만 프로젝트 단위로 설정하는 것이 나중에 프로젝트를 다른 PC로 옮기거나 공유할때 훨씬 더 편리하므로 이렇게 하도록 하자. 혹시 새로운 환경에서 작업을 하게된다면 이 경로를 또 해당 PC에 맞게 수정해주어야 한다. 


Library Directories 역시 마찬가지로 Edit 창에서 프로젝트 폴더로 복사한 lib 폴더를 지정해준다. 


opencv


마지막으로 라이브러리 파일을 직업 등록시켜 준다. 이 부분을 자주 빼먹는데 그럼 당연히 오류가 발생한다. 프로잭트 속성 창에서 Linker > Input > Additional Dependencies 옵션에서 opencv_world340d.lib 를 추가해주자. 디렉터리를 추가할 때와 마찬가지로 클릭 후 오른쪽에 화살표를 눌려 Edit 창을 열어서 추가할 수도 있다. 


참고로 Release 모드로 빌드를 할때는 opencv_world340.lib 를 추가해줘야 한다. 끝에 d 가 붙은 lib 는 Debug 모드 용이다.


또 참고로, 위 방법을 사용하지 않고 코드 최상단에 #pragmma comment(lib, "opencv_world340d.lib") 라는 코드를 넣어서 직접 라이브러리를 컴파일 경로에 추가할 수도 있다. 어떤 외부 라이브러리가 포함되어 있는지 코드상에서 확인할 수 있다는 점에서 유리하다. 편한 방법을 선택하자. 


opencv


여기까지 잘 따라왔다면 Debug 모드, x64 환경에서 빌드가 무사히 된 것을 볼 수 있다. 이제 Ctrl + F5 로 프로그램을 실행시켜보면 카메라 영상을 확인 할 수 있다. 만약 프로그램 실행을 시켰는데 dll 이 없다는 경고 문구가 뜬다면 opencv_world340d.dll 파일이 실행 파일과 같은 위치에 있는지 또는 프로젝트 폴더에 있는지 확인해보자. 간혹 opencv_ffmpeg340_64.dll 을 복사해두고 안된다고 하는 경우가 있다.