OpenCV 3.4.0 소스 코드를 Visual Studio 2017에서 빌드를 하면 특별한 에러 없이 잘 빌드가 됩니다. 그러나 Visual Studio 2013에서 OpenCV 3.4.0 소스 코드를 빌드하면 에러가 발생합니다. 일단 기본적인 빌드 설정은 아래와 같습니다.
Visual Studio 12 2013 x64
BUILD_opencv_python3 선택 해제
BUILD_opencv_world 선택
opencv_contrib 소스 코드 포함
WITH_CUDA 선택 해제
위와 같이 설정한 후 Visual Studio 2013으로 빌드할 때 나오는 에러 메시지 중 일부를 나열하면 다음과 같습니다.
위와 같이 <opencv2/core.hpp> 파일 대신 "../precomp.hpp" 파일을 #include 하는 형태로 변경하면 됩니다.
그러나 darknet_io.cpp 파일을 바꾸더라도 face_alignmentimpl.hpp 파일에서도 비슷한 에러가 발생합니다. face 모듈은 opencv_contrib 쪽 소스에 있고, 여기에는 precomp.hpp 파일이 없으므로 face_alignmentimpl.hpp 파일을 열어서 아래와 같이 수정합니다.
위와 같이 수정하고 빌드하면 opencv_world340.dll 파일을 정상적으로 빌드가 됩니다.
추가로 opencv 샘플 프로젝트를 빌드할 때 dnn 아래쪽 샘플 프로젝트에서도 빌드 에러가 발생합니다. 이때는 torch_enet.cpp 파일에서 에러가 발생하는데요, 이 파일을 열어서 아래와 같이 수정하면 에러가 사라집니다.
위 수정 사항에서 하나는 "opencv2/core/softfloat.hpp" 라고 쓰고 하나는 <opencv2/core/softfloat.hpp> 라고 입력을 했는데요, 어차피 컴파일러가 해석하는 것은 동일하고 다만 주위 소스 코드 형식을 맞쳐준 것이라고 보면 됩니다.
3줄 요약:
darknet_io.cpp 파일에서 #include <opencv2/core.hpp> 문장을 #include "../precomp.hpp" 로 수정.
face_alignmentimpl.hpp 파일에 #include "opencv2/core/softfloat.hpp" 문장 추가
torch_enet.cpp 파일에 #include <opencv2/core/softfloat.hpp> 문장 추가
간만에 반가운 소식을 전합니다. Visual Studio 2017에서 공식 지원하지 않았던 Image Watch가 이제 공식적으로 지원됩니다. Image Watch는 OpenCV 라이브러리의 Mat 객체를 영상의 형태로 보여주는 디버깅 툴인데요, Visual Studio 2015까지만 공식지원하고 Visual Studio 2017에는 설치를 할 수 없었습니다. 이때문에 Visual Studio 2017 대신 2015 버전을 계속 사용한다는 OpenCV 개발자들도 있었는데요, 다행히 오늘 Visual Studio 2017을 최신 버전으로 업데이트를 하고 나니 "Image Watch 2017"이라는 새로운 이름으로 확장 프로그램을 설치할 수 있었습니다. Image Watch 2017에 대한 자세한 설명은 아래 링크를 참고하세요.
그럼 이제부터 Visual Studio 2017에 Image Watch 2017을 설치하는 방법을 자세히 설명하겠습니다. 먼저 Visual Studio 2017을 최신 버전으로 업데이트를 합니다. 2017년 12월 6일 현재, 최신 버전은 15.5.0 입니다. 저도 방금 전에 업데이트 알림이 떠서 업데이트했습니다. Visual Studio를 15.5.0 버전으로 업데이트하지 않으면 Image Watch 2017을 설치하지 못할 수도 있으니 꼭 업데이트를 하세요. 참고로 15.5.0 업데이트에서 변경된 사항은 아래 링크에 나와 있습니다. (Visual C++ 항목에서는 그다지 눈에 띠는 내용은 없는 것 같네요.)
자, 그럼 최신 버전의 Visual Studio를 사용하고 있다고 가정하구요, Image Watch 2017을 설치하는 방법을 설명하겠습니다. 일단 Visual Studio를 실행하시구요, 메뉴에서 [도구] -> [확장 및 업데이트]를 선택하세요. 그러면 "확장 및 업데이트" 창이 새로 뜨는데요, 여기서 왼쪽 항목 중에서 [온라인] 항목을 선택하고, 오른쪽 상단의 검색창에 "Image Watch"라고 입력하세요. (Image와 Watch 사이에 빈 칸이 있어야 합니다.) 그러면 아래 그림처럼 "Image Watch 2017" 항목을 찾을 수 있을 겁니다. 이 항목을 선택한 후 [다운로드] 버튼을 클릭하세요. 간혹 "Image Watch"라고 입력을 했는데도 아래처럼 "Image Watch 2017" 항목이 나타나지 않으면 검색어를 "opencv"라고 입력하셔도 됩니다.
[다운로드] 버튼을 클릭했으면 일단 Visual Studio를 완전히 종료하세요. 그러면 아래와 같은 창이 나타납니다. 여기서 [수정] 버튼을 클릭하면 본격적인 Image Watch 2017 설치가 시작됩니다.
약간의 시간이 흐른 뒤 설치가 완료되면 아래 창이 나타납니다.
잘 설치가 된 것 같죠? 이제 실제로 Image Watch 2017을 사용해보도록 하겠습니다. Visual Studio 2017을 실행하고, 간단한 OpenCV 예제 프로그램을 작성합니다. 아래 그림에 나타난 HelloCV 예제 프로젝트는 제가 패스트캠퍼스에서 "OpenCV와 함께하는 컴퓨터 비전 프로그래밍" 캠프에서 가장 먼저 설명하는 예제 프로그램입니다. 레나 영상을 그레이스케일 형태로 불러와서 영상의 반전을 수행하는 코드입니다.
Image Watch 2017을 사용하려면 Debug 모드로 프로젝트를 빌드해야하고, 원하는 코드 라인에 중단점(breakpoint)를 지정한 후 [디버그] -> [디버깅 시작]을 수행해야 합니다. 위 그림에서는 imshow 코드를 수행하기 전에 중단점이 걸려있습니다. 이렇게 프로그램이 중단점에 의해 멈쳐 있을 때, Visual Studio 메뉴에서 [보기] -> [다른 창] -> [Image Watch] 메뉴를 선택하면 그림 오른쪽에 보이는 Image Watch 창이 나타납니다. 그리고 Image Watch 창에 나열된 Mat 클래스 타입의 변수를 선택하면 해당 변수에 저장된 영상을 (픽셀 값 숫자의 나열이 아닌) 말 그대로 영상 형태로 볼 수 있습니다. 편리하죠?? :-)
소리소문없이 OpenCV 3.3.1 버전이 나왔습니다. 기존 OpenCV 3.3.0 버전이 8월 초에 나왔으니까 두달 좀 지나서 버그패치(?) 성격의 revision update 버전이 나온 것 같습니다.
OpenCV 3.3.1 버전은 OpenCV 공식 사이트에는 나타나있지 않고 GitHub 소스 사이트에만 아주 조용히 태그가 그어져서 릴리즈 되고 있습니다. (10/26 추가: 글을 올리고 하루가 지나고 나니까 OpenCV 공식 사이트에도 OpenCV 3.3.1 버전이 올라가 있네요.) OpenCV 기본 모듈과 추가 모듈(extra module) 소스 코드는 아래 링크에서 다운받을 수 있습니다.
제가 OpenCV 강의에서 예제 프로그램 실습을 진행할 때, 예전에는 Visual Studio, 특히 Visual C++에서 [Win32 콘솔 응용 프로그램] 형식으로 새 프로젝트를 만들어서 코딩을 했습니다. 특히 stdafx.h 파일을 사용하는 "미리 컴파일된 헤더" 기능을 사용하지 않는 프로젝트를 만들기 위해 응용 프로그램 설정 창에서 "빈 프로젝트" 항목을 선택하여 프로젝트를 만들었는데요...
최근에 Visual Studio 2017 버전이 15.3 이상으로 변경되면서 Win32 콘솔 응용 프로그램 템플릿이 아예 사라져버렸습니다. 대신에 가장 비슷해보이는 [Windows 콘솔 응용 프로그램] 템플릿을 사용하면 stdafx.h 파일을 사용하는 프로젝트를 만들어줘서 난감했었는데요..
인터넷을 찾아보니 Visual Studio 2017 릴리즈 노트에 해당 내용이 적혀있었습니다.
위에서 맨 마지막에 적혀있듯이 이전의 [Win32 콘솔 응용 프로그램]과 같은 형식으로 새 프로젝트를 만들려면 [Windows 데스크톱 마법사] 항목을 선택하면 됩니다.
예를 들어, Visual Studio 2017에서 [파일] -> [새로 만들기] -> [프로젝트] 메뉴를 선택하고, 새 프로젝트 창에서 [Windows 데스크톱 마법사] 항목을 선택한 후 [확인] 버튼을 클릭합니다.
그러면 아래와 같은 옵션 창이 나타나는데요,
여기서 기본 선택되어 있는 [미리 컴파일된 헤더] 항목의 선택을 해제하고, [빈 프로젝트] 항목을 선택하면 완전히 비어있는 새 프로젝트를 만들 수 있습니다. 그리고나서 [프로젝트] -> [새 항목추가] 메뉴를 선택하여 새 소스 파일 또는 헤더 파일을 추가하여 코딩을 시작하는 것이죠.
OpenCV 3.3 버전에서 가장 큰 변경점은 dnn(deep neural network) 모듈이 이전에 opencv_contrib 쪽에 있다가 이번에 메인인 opencv 소스쪽으로 옮겨졌다는 것입니다. 그리고 Halide(할라이드)라는 새로운 영상 처리 전용 언어를 처음으로 적용하였고, 다양한 최적화와 기능 향상을 추가했다고 합니다. 좀 더 자세한 변경점은 아래 링크를 참고하시구요..
위 페이지에 나타난 몇가지 항목에 대해 간략한 번역을 해봤습니다. (번역하지 않은 문장도 있으니 자세한 사항은 원문 링크를 참고하세요.)
High-level API has been modified and is even more convenient now. 고수준 API가 개선되어 사용하기 더 편리해졌습니다.
The regression tests have been expanded, some new tests have been added. Now, there are 46 of them. 회귀 테스트가 확장었고, 몇몇 새로운 테스트가 추가되었습니다. 이제 46개의 테스트가 있습니다.
Many bugs have been fixed in Torch and TF loaders, as well as in some processing layers. Now we check that on a certain set of networks the results from OpenCV DNN match or very close to the results from the original frameworks. We also check that the results claimed in the papers for such networks are achievable with OpenCV DNN. Torch와 TF 로더(loader)와 몇몇 처리 레이어에 있던 많은 버그가 수정되었습니다. 이제 특정 네트워크에서 OpenCV DNN의 결과와 원본 프레임워크의 결과가 일치하는지를 확인합니다. 또한 특정 논문에서 주장하는 결과를 OpenCV DNN을 통해 달성할 수 있는지를 확인합니다.
Performance has been substantially improved. Layer fusion has been implemented and some performance-critical layers have been optimized using AVX, AVX2, SSE and NEON. An external BLAS (OpenBLAS, MKL, ATLAS) is not needed anymore. 성능이 크게 향상되었습니다. 레이어 융햡이 구현되었으며 몇몇 성능이 중요한 레이어는 AVX, AVX2, SSE, NEON 등을 사용하여 최적화되었습니다. OpenBLAS, MKL, ATLAS 같은 외부 BLAS는 더이상 필요하지 않습니다.
New samples in C++ and Python have been added. 새로운 C++과 Python 예제가 추가되었습니다.
The optional Halide backend has been added. It can accelerate OpenCV DNN on GPU when the GPU is fast enough. See Deep Learning in OpenCV for details about the module. Halide 코드가 추가되었습니다. 이로써 GPU가 충분히 빠른 경우 GPU에서 OpenCV DNN을 빠르게 동작시킬 수 있습니다. 모듈에 대한 자세한 내용은 "Deep Learning in OpenCV"을 참고하십시오.
Upgraded IPPICV from 2015.12 to 2017.2 version brought ~15% speed improvement into core and imgproc modules (measured as geometrical mean over the corresponding performance tests). IPPICV가 2015.12 버전에서 2017.2 버전으로 업그레이드되어 core와 imgproc 모듈에서 속도가 15%까지 향상되었습니다.
Dynamic dispatching of SSE4.2/AVX/AVX2 code has been implemented. Previously, OpenCV had to be built with SSE4.x/AVX/AVX2 turned on in order to use such optimizations and that made it incompatible with older hardware. Now the OpenCV binaries automatically adapt to the real hardware and make use of new instructions if they are available while retaining compatibility with older hardware. All the existing AVX/AVX2 optimizations in OpenCV have been refactored to use this technology. AVX acceleration of DNN also uses dynamic dispatching. SSE4.2/AVX/AVX2 코드의 동적 디스패칭이 구현되었습니다. 이전에는 이러한 최적화를 사용하기 위해 SSE4.x/AVX/AVX2를 켜고 OpenCV를 빌드해야했기 때문에 OpenCV는 이전 하드웨어와 호환되지 않았습니다. 이제 OpenCV 바이너리는 실제 하드웨어에 자동으로 적응하고 구형 하드웨어와의 호환성을 유지하면서 사용 가능한 새로운 명령어를 사용합니다. 기존에 있던 모든 OpenCV AVX/AVX2 최적화 기법은 리펙토링되어 이러한 기술을 사용합니다. DNN을 위한 AVX 가속화도 동적 디스패치를 사용합니다.
OpenCV can now be configured and built as C++ 11 library. Pass -DENABLE_CXX11=ON to CMake. On some modern Linux distributions, like the latest Fedora, it’s enabled by default. OpenCV는 이제 C++11 라이브러리를 사용하여 구성할 수 있습니다. CMake에서 -DENABLE_CXX11=ON 을 설정하세요. 최신 Fedora같은 최근의 리눅스 배포판에서는 C++11 구성이 기본으로 활성화되어 있습니다.
New features for C++ 11 users have been added: C++11 사용자를 위한 새로운 기능이 추가되었습니다.
Support for hardware-accelerated video encoding/decoding using Intel GPUs through Intel Media SDK has been implemented for Linux (in the form of backends for cv::VideoCapture and cv::VideoWriter). 리눅스에서 인텔 미디어 SDK를 통해 인텔 GPU를 사용하는 하드웨어 가속 비디오 인코딩/디코딩에 대한 지원이 구현되었습니다.
위 사이트에서 opencv-3.3.0-vc14.exe 파일은 Windows 환경에서 Visual Studio 2015를 이용하여 미리 빌드한 LIB, DLL 파일을 제공합니다. 그러나 이 DLL 파일은 opencv_contrib 쪽 코드는 포함되어 있지 않기 때문에 opencv_contrib 코드까지 사용하려면 아래 두 소스 코드 압축 파일을 다운로드 받아 직접 빌드해야 합니다.
올해 2월에 조립 PC를 새로 장만해서 Visual Studio 2015를 깔았고, 이후 Visual Studio 2017 버전이 나와서 Visual Studio 2015를 지우고 Visual Studio 2017만 사용하려고 했었습니다. 그런데 nVidia Cuda가 Visual Studio 2017을 아직 지원하지 않아서 다시 Visual Studio 2015를 설치를 했습니다. 그리고나서 OpenCV 최신 소스를 Visual Studio 2015로 새로 빌드하려고 CMake에서 "Visual Studio 14 2015 Win64"를 선택했는데, 이상한 에러가 발생하네요.
The CXX compiler identification is unknown The C compiler identification is unknown
일단 눈으로 보이는 에러 메시지는 CXX, C 컴파일러를 찾지 못한다는 것인데요, 자세한 내용을 확인하기 위해 C:/opencv/mybuild/CMakeFiles/CMakeOutput.log 파일을 열어보았습니다.
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed. Compiler: Build flags: Id flags:
The output was: 1 Microsoft (R) Build Engine 버전 14.0.25420.1] Copyright (C) Microsoft Corporation. All rights reserved.
빌드 시작: 2017-08-03 오전 10:47:35 1 노드의 "C:\opencv\mybuild\CMakeFiles\3.9.0\CompilerIdCXX\CompilerIdCXX.vcxproj" 프로젝트(기본 대상)입니다. PrepareForBuild: "Debug\" 디렉터리를 만들고 있습니다. "Debug\CompilerIdCXX.tlog\" 디렉터리를 만들고 있습니다. InitializeBuildStatus: "AlwaysCreate"이(가) 지정되었기 때문에 "Debug\CompilerIdCXX.tlog\unsuccessfulbuild"을(를) 만들고 있습니다. ClCompile: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\CL.exe /c /nologo /W0 /WX- /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc140.pdb" /Gd /TP /errorReport:queue CMakeCXXCompilerId.cpp CMakeCXXCompilerId.cpp Link: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdCXX.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdCXX.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdCXX.lib" /MACHINE:X64 Debug\CMakeCXXCompilerId.obj LINK : fatal error LNK1158: 'rc.exe'을(를) 실행할 수 없습니다. [C:\opencv\mybuild\CMakeFiles\3.9.0\CompilerIdCXX\CompilerIdCXX.vcxproj] "C:\opencv\mybuild\CMakeFiles\3.9.0\CompilerIdCXX\CompilerIdCXX.vcxproj" 프로젝트를 빌드했습니다(기본 대상). - 실패
빌드하지 못했습니다.
"C:\opencv\mybuild\CMakeFiles\3.9.0\CompilerIdCXX\CompilerIdCXX.vcxproj"(기본 대상)(1)-> (Link 대상) -> LINK : fatal error LNK1158: 'rc.exe'을(를) 실행할 수 없습니다. [C:\opencv\mybuild\CMakeFiles\3.9.0\CompilerIdCXX\CompilerIdCXX.vcxproj]
경고 0개 오류 1개
경과 시간: 00:00:00.81
...
중간에 보면 rc.exe 를 실행할 수 없다는 메시지가 나타납니다. rc.exe는 "Microsoft (R) Windows (R) Resource Compiler"를 의미하는 것인데, 이 파일을 찾을 수 없다는 의미인거네요. 시작 메뉴에서 "Visual Studio 2015 Tools 명령 프롬프트 열기" 메뉴를 찾아서 실행하고, 나타난 도스창에서 rc.exe를 입력하면 실제로도 해당 파일을 찾을 수 없다고 나타납니다.
이와 반대로 "Open Visual Studio 2017 Tools Command Prompt" 커맨드 창에서는 rc.exe /? 명령을 실행하면 아래와 같이 프로그램이 잘 실행됩니다.
결국 원인을 알 수 없는 이유로 인하여 Visual Studio 2015 환경에서는 rc.exe 파일을 찾지 못한다는 것이고, 이는 기본적으로 Visual Studio 2017 커맨드창 환경과 Visual Studio 2015 커맨드창의 PATH 설정이 다르기 때문일 것입니다. 그래서 두 창에서 각각 PATH 명령을 입력해서 그 차이를 비교해보고, 실제 rc.exe 파일이 있는 위치를 검토해보니 아래 디렉토리가 PATH에 있느냐 없느냐의 차이인 것으로 보였습니다.
바로 이 폴더에 Windows SDK 버전 10의 rc.exe 파일이 있네요. 그러므로 Visual Studio 2015 버전에서도 이 디렉토리를 PATH 환경 변수에 추가해주면 되는데요, 음.. 반대로 위 폴더에 있는 rc.exe 파일을 Visual Studio 2015 커맨드창 PATH 경로에 복사해주어도 정상적으로 동작을 합니다. 그래서 해결책은 이렇습니다.
아주 단순하게, 가우시안 필터와 캐니 엣지 검출에 대해서만 OpenCV 3.2 vs. OpenCV 3.3.0-rc 두 버전 간의 성능을 비교해봤습니다.
소스 코드는 매우 단순하게 레나 영상을 불러와서 가우시안 블러 & 캐니 엣지 검출을 100번 수행하도록 하였고, 그 실행 시간을 측정하여 출력했습니다.
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
cout << "Running GaussianBlur & Canny on 512x512 lenna image (100 times): " << endl;
int64 t1 = getTickCount();
Mat blurred, dst;
for (int i = 0; i < 100; i++) {
GaussianBlur(src, blurred, Size(), 1.0, 1.0);
Canny(blurred, dst, 50, 150);
cout << ".";
}
int64 t2 = getTickCount();
cout << "\nIt took " << (t2 - t1) * 1000 / getTickFrequency() << " ms." << endl;
return 0;
}
그 결과 OpenCV 3.2 버전을 사용하여 빌드했을 때에는 결과가 아래와 같구요..
OpenCV 3.3.0-rc 버전을 사용하여 빌드했을 때에는 결과가 이렇습니다.
미세하지만 3.3.0-rc 버전이 더 빠르게 동작하는 것 같습니다. OpenCV 3.3.0-rc 버전은 220~230ms 정도 걸리는데, OpenCV 3.2 버전은 240~260ms 정도로 분포하고 있네요. 좀 더 많은 함수를 사용해서 테스트를 해보면 좋겠지만, 일단은 이 정도만..
소리 소문도 없이 OpenCV 3.3.0-rc 버전이 릴리즈되었습니다. OpenCV github releases 페이지를 보니 3일 전에 OpenCV 3.3.0-rc 버전이 소스 파일 형태로 업데이트가 되었다고 표시되어 있는데요, opencv_contrib 쪽 소스 코드의 3.3.0-rc 버전은 10일전에 올라왔다고 되어 있습니다. 아마도 2017년 6월 30일 경에 3.3.0-rc 버전이 모두 릴리즈되고 메인 소스 쪽에만 약간의 업데이트가 있었던 것은 아닌가 싶습니다. OpenCV 3.3.0-rc 버전은 아래 링크에서 다운로드 받을 수 있습니다.
OpenCV 3.3.0-rc 버전 릴리즈 소식은 OpenCV 공식 사이트에서도 언급이 되어 있지 않습니다. 조용히 RC 버전을 릴리즈하고 내부적으로 테스트를 하고 있는 것이 아닌가 싶은데요, 어쨋든 새롭게 릴리즈된 버전이고 하니 다운로드 받아서 직접 빌드하는 방법을 알아보겠습니다.
기존에 OpenCV 3.2 버전을 빌드하는 방법은 아래 블로그와 유투브에서 설명한 적이 있습니다. 혹시 OpenCV 빌드를 한 번도 안해보신 분들은 아래 글과 동영상을 먼저 훑어보시는 것을 권장하구요..
개인적으로 OpenCV 빌드 작업은 C:\opencv 폴더를 만들어서 진행을 합니다. 그러므로 C:\opencv 폴더를 만들고, 여기에 OpenCV 3.3.0-rc 소스 코드의 압축 파일을 해제합니다. opencv 메인 소스와 opencv_contrib 소스 코드를 모두 압축 해제하면 아래와 같은 폴더 구조를 가지게 됩니다.
위 그림에서 mybuild 폴더는 실제 빌드 작업을 진행할 폴더이며, 여러분이 직접 만들어 주어야 합니다. 일단 폴더 구조를 위와 같이 구성하였으면 이제 CMake 프로그램을 실행하여 Visual Studio 2017 용 솔루션 파일과 프로젝트 파일을 생성합니다. CMake 사용법에 대한 자세한 설명은 위에 링크해놓은 블로그와 동영상을 참고하시기 바라며, 다만 여기서는 CMake 기본 설정에서 변경한 내역만 정리하겠습니다.
OpenCV 3.2에서는 opencv_contrib 쪽 소스 코드를 함께 빌드할 때 BUILD_opencv_world 옵션을 선택하면 에러가 발생하는 버그가 있었는데요, 그런 버그는 이미 예전에 해결이 되었습니다. 그리고 2017년 1월에 발생한 OpenCV 커밋 중에 opencv_contrib 모듈도 opencv_world 쪽으로 포함시키는 내용이 있어서 모든 opencv 기능을 opencv_world330.dll 하나로 사용할 수 있습니다. WITH_CUDA 선택을 해제한 이유는 CUDA가 Visual Studio 2017을 지원하지 않기 때문입니다.
found Intel IPP (ICV version): 2017.0.2 [2017.0.2] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win found Intel IPP IW binaries: 2017.0.2 at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win/../ippiw_win/ Could not find OpenBLAS include. Turning OpenBLAS_FOUND off Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off A library with BLAS API not found. Please specify library location. LAPACK requires BLAS A library with LAPACK API not found. Please specify library location. Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) Could NOT find Matlab (missing: MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS MATLAB_ROOT_DIR MATLAB_LIBRARIES MATLAB_LIBRARY_DIRS MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file Caffe: NO Protobuf: NO Glog: NO Looking for tiny_dnn.h Looking for tiny_dnn.h - found Found tiny-dnn in: C:/opencv/mybuild/3rdparty/tinydnn/tiny-dnn-1.0.0a3 The protocol buffer compiler is not found (PROTOBUF_PROTOC_EXECUTABLE='Protobuf_PROTOC_EXECUTABLE-NOTFOUND') freetype2: NO harfbuzz: NO No preference for use of exported gflags CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported gflags CMake configuration if available. Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake. Failed to find gflags - Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components. Failed to find gflags - Could not find gflags include directory, set GFLAGS_INCLUDE_DIR to directory containing gflags/gflags.h Failed to find glog - Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags Processing WORLD modules... module opencv_core... module opencv_flann... module opencv_hdf... module opencv_imgproc... module opencv_ml... module opencv_objdetect... module opencv_phase_unwrapping... module opencv_photo... module opencv_plot... module opencv_reg... module opencv_surface_matching... module opencv_video... module opencv_xphoto... module opencv_bgsegm... module opencv_dnn... Torch importer has been enabled. To run the tests you have to install Torch ('th' executable should be available) and generate testdata using opencv_extra/testdata/dnn/generate_torch_models.py script. module opencv_face... module opencv_fuzzy... module opencv_imgcodecs... module opencv_shape... module opencv_videoio... module opencv_xobjdetect... module opencv_highgui... module opencv_superres... module opencv_bioinspired... module opencv_dpm... module opencv_features2d... module opencv_line_descriptor... module opencv_saliency... module opencv_text... Tesseract: NO module opencv_calib3d... module opencv_ccalib... module opencv_datasets... module opencv_rgbd... module opencv_stereo... module opencv_structured_light... module opencv_tracking... module opencv_videostab... module opencv_xfeatures2d... module opencv_ximgproc... module opencv_aruco... module opencv_optflow... module opencv_stitching... Processing WORLD modules... DONE Processing module opencv_img_hash... Processing module opencv_python3... Processing module opencv_ts...
General configuration for OpenCV 3.3.0-rc ===================================== Version control: unknown
Extra modules: Location (extra): C:/opencv/opencv_contrib-3.3.0-rc/modules Version control (extra): unknown
Video I/O: Video for Windows: YES DC1394 1.x: NO DC1394 2.x: NO FFMPEG: YES (prebuilt binaries) avcodec: YES (ver ) avformat: YES (ver ) avutil: YES (ver ) swscale: YES (ver ) avresample: YES (ver ) GStreamer: NO OpenNI: NO OpenNI PrimeSensor Modules: NO OpenNI2: NO PvAPI: NO GigEVisionSDK: NO DirectShow: YES Media Foundation: NO XIMEA: NO Intel PerC: NO
Parallel framework: Concurrency
Trace: YES (with Intel ITT)
Other third-party libraries: Use Intel IPP: 2017.0.2 [2017.0.2] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win Use Intel IPP IW: prebuilt binaries (2017.0.2) Use Intel IPP Async: NO Use Lapack: NO Use Eigen: NO Use Cuda: NO Use OpenCL: YES Use OpenVX: NO Use custom HAL: NO
OpenCL: <Dynamic loading of OpenCL library> Include path: C:/opencv/opencv-3.3.0-rc/3rdparty/include/opencl/1.2 Use AMDFFT: NO Use AMDBLAS: NO
cvconfig.h is in: C:/opencv/mybuild -----------------------------------------------------------------
Configuring done
위와 같이 설정하여 OpenCV.sln 파일을 생성합니다. 그리고 Visual Studio 2017에서 OpenCV.sln 파일을 불러와서 빌드를 진행하면 되는데요... 에러가 하나 발생하네요 ㅠㅠ
C:\opencv\opencv_contrib-3.3.0-rc\modules\ximgproc\src\structured_edge_detection.cpp 파일 584라인과 585 라인에서 M_PI를 사용하는 부분에서 에러가 발생하는데요, 아마도 math.h 파일의 M_PI를 제대로 포함하지 않았기 때문인 것 같습니다. 굳이 opencv 소스 코드에서 M_PI를 사용하는 것보다는 CV_PI를 사용하는 것이 더 깔끔할테니까 아래 그림과 같이 M_PI 대신 CV_PI로 소스 코드를 수정합니다.
그리고는 다시 빌드를 하면 잘 진행이 됩니다. (참 쉽죠? :-)
전체 솔루션 빌드를 진행하고, INSTALL 프로젝트도 따로 빌드를 하고나면 C:\opencv\mybuild\install 폴더에 헤더 파일, LIB 파일, DLL 파일이 사이좋게 모이게 됩니다.
opencv_world330.dll 파일 하나의 크기가 거의 100MByte입니다. 용량이 좀 부담스러울 수도 있지만 OpenCV 공부를 하는 과정에서는 opencv_world330.dll 파일 하나만 있으면 편해서 저는 opencv_world 속성을 선택하는 것을 선호합니다. 회사에서 프로젝트를 진행하거나 배포를 위한 목적이라면 개별 모듈을 따로 빌드하는 것이 더 좋겠지요.
참고로 OpenCV 3.3.0-rc 버전에서는 예전에 opencv_contrib 쪽 소스 구조에 있던 dnn(deep neural network) 모듈이 opencv 메인 소스 쪽으로 이동을 했습니다. 그 외에도 C++11 지원이 추가된 것으로 보이고, CPU 아키텍쳐(SSE, AVX, SIMD, etc)에 대한 소스 코드 분기가 많이 추가된 것 같네요. 공식적인 change log가 없어서 어떤 것이 더 바뀐 것인지는, 나중에 OpenCV 3.3.0 정식 버전이 릴리즈되면 알 수 있을 것 같습니다.