[OpenCV] 1. 소스 빌드하기

OpenCV 소스 빌드하기

예전 도서와 달리 요즘에는 openCV 빌드부터 하라고 나온다.
이리 저리 찾아본 봐로는 3.0이상부터문제가 생긴 듯한데…
3.0부터 기존 openCV의 기본 모듈이 별도의 외부 모듈로 분리가 되었다.

또한 3.0 기준으로 vs2012,2013용으로 바이너리 제공하기에
vs2010처럼 바이너리가 제공되지 않으면 빌드를 하는 수밖에 없다.
현재 찾아봐도 vs 2017용으로는 나온게 없어서…
그리고 tensorflow와 마찬가지로 cpu와 gpu등의 최적화 옵션을 적용하기 위해선 빌드가 필수적이다.

2500개가 넘는 최신 비전 알고리즘과 머신러닝 알고리즘을 지원하며 무엇보다도 공짜(BSD 라이센스)

현재 빌드 환경

  • 데스크탑
    • Windows 10 64Bit Pro Rs4
    • Visual Studio 2017
    • Intel i7-4790/16GB RAM / GTX 1060
  • 노트북
    • Windows 10 64bit home RS4
    • VS2017
    • i5-8550u/ 8GB RAM / 내장 그래픽 (HD620)
  • opencv 버전 : 3.4.3
  • cmake 필요

빌드 순서 및 내용

  • 다 블로그 찾아보는 내용이기에 필요한것만 정리
  • cmake로 confgigure
    • cmake는 make파일을 만들어주는 유틸이다. 윈도우에서는 비주얼 스튜디오용 솔루션 파일과 프로젝트 파일을 생성
    • 3.8 이상 버전 필요
  • 옵션들(내가 선택한 것들 위주로)-검색되는 키워드로 제목을 달았다.
    • eigen
      • 선형대수, 매트릭스, 벡터 연산등을 빠르게 처리하는데 사용하는 라이브러리다.
    • TBB
      • 병렬용인데 사실 최신 opencv에선 불필요하다. cpu에 따라서 알아서 인텔IPP와 같이 concurrency로 맞춰진다. 자세한 내용은 http://kkokkal.tistory.com/1301 참조
    • IPP
      • 설치 필요 없다. 최신버전은 이미 포함되어 있음
    • nonfree
      • 저작권으로 인해 무료로 사용할 수 없는 기능과 알고리즘을 사용하게 해준다.
      • 당연히 체크하고 나중에 최종 제품 릴리즈 할때 고려해봐야한다.
      • 고려할때는 참조 부분 참조해서 질문 올리면 될거 같다.
        예: https://www.olis.or.kr/consulting/qnaDetail.do?bbsNum=27524
    • extra
      • 사실 빌드의 가장 큰 이유기도 하는데 구버전의 많은 기능이 extra 모듈로 빠져있기 떄문이다.
      • extra로 검색해서 경로를 contrib 소스의 module폴더로 잡는다.
    • example
      • 예제를 빌드하는 것은 빌드 시간을 많이 잡아먹는다. 하지만 공부를 위해서 example 전부 체크
    • python쪽 환경
      • 일반적으로 파이썬을 깔면 디버깅용 라이브러리가 깔리지 않기때문에 opencv빌드시 에러가 난다.
      • 사실 파이썬쪽의 디버깅용은 필요가 없긴 한데 찜찜해서 chocolatey 의존이 아닌 직접 윈도우용 파이썬 3.5.4를 설치하면서 디버깅용 심볼과 디버깅용 바이너리를 깔았다. 이경우 cmake에서 자동으로 디버깅라이브러리(xxxd.lib)를 찾아준다.
    • CUDA
      • 제일 문제가 되는 부분. 빌드시간이 어마어마하다.
      • openCV에서 사용하기 위해 체크를 하고 컨피규어를 다시 하면 새로운 옵션들이 나온다.
      • 현재 fast math 체크 안했더니 잘되는듯.
      • 현재 텐서플로우 빌드를 위해 Cuda v9.2에 CUDNN 7.2버전이 설치 되어 있는 상태에서 opencv 빌드를 했다.
      • cl.exe 못찾을 경우???????
    • world
      • 라이브러리 dll을 하나를 통으로 만들어 준다. 이러면 프로젝트 참조 라이브러리에 각각 lib 이름을 기록할 필요 없이 world.lib 하나만 기록하면 되기에 편하다. 릴리즈 시 용량이 문제가 되면 릴리즈용은 world를 제외해야하겠지. 개발을 위해선 체크를 해야 나중에 편하다. 물론 시간은 오래걸린다.
  • 전부 끝나면 generate 후 vs2017에서 opencv.sln(솔루션파일)을 열면 전체 솔루션이 열린다.
  • 기본적으로 타켓은 all_build가 활성화 되어 있다.
  • 빌드 순서는 디버깅에서 솔루션 빌드 -> 디버깅에서 install 타켓 빌드 -> 릴리즈에서 솔루션 빌드 -> 릴리즈에서 install 타겟빌드
  • 나의 경우에는 인스톨에서 에러가 발생했었는데 파이썬을 install for all users로 설치했어서 파이썬이 개인 appdata밑이 아닌 c:\program files 밑에 깔려 있는 상태라 install 타겟빌드시 이쪽으로 관련 파이썬 파일 복사중에 권한 부족으로 에러가 났었다. 나의 경우는 install 타겟 빌드시에 관리자 권한 의 vs2017로 해결하였다.
  • 이렇게 하면 좀 귀찮게 솔루션 빌드할땐 일반 권한, 타겟빌드시 관리자 권한으로 각각 열어야하는데 대신 에러가 하나도 안나니까 이렇게 하는게 좋을 것 같다. 에러가 사실 나더라도 라이브러리 잘 만들어지고 잘 작동하는데 그래도 에러가 자꾸 걸려서 결국 이렇게 귀찮은 방법으로 해결했다.
  • 일단 4단계가 다 끝나면 결과적으로 install 밑에만 참조해서 프로젝트를 만들 수 있을 것 같다.

테스트

한번 테스트를 해봐야지

일단 빈 프로젝트를 만든다.
vs2017에서는 win32 콘솔 마법사가 사라져서 c++밑의 데스크톱 마법사를 선택후 빈 프로젝트 선택해서 만들어야한다. 그리고 소스에서 cpp 파일을 선택한후 cpp파일을 만든다(ex: main.cpp)

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
Mat img = imread("apple.jpg");

if (img.empty()) {
cerr << "Image Load fail" << endl;
return -1;
}

cout << "width: " << img.cols << ", height: " << img.rows << endl;

namedWindow("image");
imshow("image", img);

waitKey(0);
return 0;
}

그림 불러와서 없으면 에러 뿜고 있으면 width와 height를 콘솔에 찍어주며 윈도우에 그림을 보여준다. 프로젝트 속성에 들어가서 빌드했던 라이브러리를 참조하도록 한다.

  • c/c++ -> 추가포함 데렉터리 : install\include (인스톨해서 헤더가 모여있기에 추가가 용이하다.)

  • 링커 -> 추가 라이브러리 디렉터리 : install\x64\vc15\lib(vs2017용으로 빌드해서 vc15용이 드디어 보인다)

  • 링커 ->입력 -> 추가 종속성 : world 라이브러리 풀네임(ex:opencv\_world343d.lib)
    (릴리즈용과 디버깅용 다르게 해주는 거 잊지말자-d있는 것이 디버깅용)

  • 프로젝트에 이미지 없으니 실제 보고 싶으면 이미지 복사해서 프로젝트 폴더에 넣자 . 사실 install\samples\data에 가면 많은 이미지들이 있다. 거기서 하나 복사해서 넣었다. 나는 사과 ㅋㅋ

  • 빌드는 에러가 안나는데 실행하면 opencv\_world343d.lib를 찾지 못해서 에러가 난다. 해당 bin에 패스를 걸어주자. 나의 경우에는 C:\dev\openCV\build\cv\install\x64\vc15\bin.

  • 만약 또 에러가 발생한다면 새로 한 패스가 vs2017에 반영이 안되서 그러니 다시 재실행후 디버거 실행하면 결과를 볼 수 있다.

테스트 하나 더 해보자

웹캠을 가져와서 보여주기.

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;


int main()
{
VideoCapture capture(0);
if (!capture.isOpened())
{
cout << "웹캠 못연다." << endl;
return 1;
}
Mat frame;
namedWindow("input", 1);

capture.set(CAP_PROP_FPS, 30);

while (1)
{
//웹캠으로부터 1프레임 read
capture >> frame;

int fps = capture.get(CAP_PROP_FPS);
int wait = int(1.0 / fps * 1000);
cout << "fps: " << fps << endl;

//화면에 영상을 보여줌
imshow("input", frame);

//esc 누르면 종료
if (waitKey(wait) == 27) break;
}
return 0;
}

앞서의 테스트와 마찬가지로 라이브러리 설정은 해줘야함.
실행하면 웹캠 화면을 윈도우 창으로 볼 수 있다.

Related POST

공유하기