검색결과 리스트
글
OpenCV + Extra Module을 하나의 world 파일로 build하기
opencv 3.0 버전 이상부터는 highgui, imgproc, ... 등등 opencv에 있는 여러 모듈들을 하나의 world 파일로 build할 수 있는 기능이 제공된다.
- 3.0 버전: opencv_world300.lib, opencv_world300.dll
- 3.1 버전: opencv_world310.lib, opencv_world310.dll
하지만 opencv 기본 모듈에 포함되지 않은 extra module들을 같이 포함하여 build할 경우에는 각 모듈마다 별도의 dll 파일들이 생성되어 이것들을 모두 들고 다녀야 하는 번거로움이 있다.
opencv 기본모듈과 extra 모듈을 모두 포함하여 하나의 world 파일로 build 하는 방법이 있는지 인터넷을 찾아봤지만 아무리 뒤져도 관련 방법을 찾을 수 없었다. 그래서 스스로 이것 저것 해보다가 해결책을 찾게 되었는데 조금 번거롭긴 하지만 아래와 같이 하면 single build가 가능하다.
Step 1. 준비물
- opencv 소스코드 다운로드: https://github.com/Itseez/opencv
- opencv extra module 다운로드: https://github.com/Itseez/opencv_contrib
- cmake 최신버전 다운로드: http://www.cmake.org/download/
opencv와 extra module의 소스코드는 master branch의 최신 버전을 git clone이나 zip파일로 직접 다운로드한다. 선호에 따라서 정식 release 버전을 받을수도 있겠지만 여기서는 최신 버전을 git에서 직접 다운받는 것을 가정한다.
Step 2. extra module을 opencv module과 합치기
opencv 설치 폴더를 opencv, extra module 설치 폴더를 opencv_contrib라고 했을 때, opencv_contrib\module\에 있는 extra 모듈들을 전부 opencv\module\ 밑으로 옮긴다 (처음 다운받은 폴더에 보면 opencv\modules\에는 core, highgui, imgproc 등의 기본적인 모듈들이 존재하고, opencv_contrib\modules\에는 aruco, bgsegm, tracking, optflow 등의 extra module들이 존재한다. 이 extra module들 전체를 그대로 opencv\modules\ 밑으로 복사 또는 이동시켜서 기본 모듈들과 합친다).
Step 3. cmake 설정하기
cmake를 실행시킨 후 opencv 설치 폴더를 source로 설정하고, binary를 build할 폴더를 새로 생성하여 지정한 후 configure 버튼을 누르면 extra module들이 기본 모듈들과 함께 활성화되어 선택할 수 있게 됨을 확인할 수 있다.
이제 cmake에서 자신의 필요에 맞게 build 옵션들을 적절히 설정한다. 이 때, 기본적으로 설정해야 할 부분은 다음과 같다.
<CMakeCache.txt>
BUILD_opencv_world:BOOL=ON
BUILD_opencv_contrib_world:BOOL=OFF
OPENCV_ENABLE_NONFREE:BOOL=ON
OPENCV_EXTRA_MODULES_PATH:PATH=
BUILD_SHARED_LIBS:BOOL=ON
BUILD_WITH_STATIC_CRT:BOOL=OFF
opencv_world는 지금 하고 있는 일의 가장 중요한 목적이므로 당연히 체크하고 opencv_contrib_world는 체크해제, OPENCV_ENABLE_NONFREE는 활성화, OPENCV_EXTRA_MODULES_PATH는 기본값인 공백으로 그대로 놔둔다. dll 빌드를 위해서는 위와 같이 BUILD_SHARED_LIBS를 체크하고 만일 static library로 빌드할 경우에는 이 항목을 체크 해제한다 (static library로 빌드할 경우에도 이후의 절차를 따르면 하나의 world 파일로 빌드된다).
기타 다른 옵션들은 자신의 필요에 따라 적절하게 설정한다. 하지만 빠른 빌드를 위해서 아래와 같이 부가적인 요소들은 제거해도 좋다 (당연한 말이겠지만 build opencv apps와 같이 자신에게 필요한 기능이 있을 경우에는 자신이 원하는대로 설정한다).
BUILD_DOCS:BOOL=OFF
BUILD_EXAMPLES:BOOL=OFF
BUILD_PACKAGE:BOOL=OFF
BUILD_PERF_TESTS:BOOL=OFF
BUILD_TESTS:BOOL=OFF
BUILD_opencv_apps:BOOL=OFF
이제 설정을 마친 후 configure 버튼을 다시 누르면 "Error in configuration process, project files may be invalid"라는 팝업과 함께 다음과 같은 에러 메시지들이 출력된다.
WARNINGUnresolved dependencies or loop in dependency graph (3)
Processed OPENCV_MODULE_opencv_dnn_DEPS:
opencv_aruco;opencv_bgsegm;opencv_bioinspired;opencv_calib3d;opencv_ccalib;opencv_core;opencv_datasets;opencv_dpm;opencv_face;opencv_features2d;opencv_flann;opencv_fuzzy;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_line_descriptor;opencv_ml;opencv_objdetect;opencv_optflow;opencv_phase_unwrapping;opencv_photo;opencv_plot;opencv_reg;opencv_rgbd;opencv_shape;opencv_stereo;opencv_stitching;opencv_structured_light;opencv_superres;opencv_surface_matching;opencv_text;opencv_tracking;opencv_video;opencv_videoio;opencv_videostab;opencv_world;opencv_xfeatures2d;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
Good modules:
opencv_core;opencv_flann;opencv_imgproc;opencv_ml;opencv_photo;opencv_reg;opencv_surface_matching;opencv_video;opencv_fuzzy;opencv_imgcodecs;opencv_shape;opencv_videoio;opencv_highgui;opencv_objdetect;opencv_plot;opencv_superres;opencv_xobjdetect;opencv_xphoto;opencv_bgsegm;opencv_bioinspired;opencv_dpm;opencv_face;opencv_features2d;opencv_line_descriptor;opencv_text;opencv_calib3d;opencv_ccalib;opencv_datasets;opencv_rgbd;opencv_stereo;opencv_stitching;opencv_tracking;opencv_videostab;opencv_xfeatures2d;opencv_aruco;opencv_phase_unwrapping;opencv_structured_light
Bad modules: opencv_optflow;opencv_world;opencv_ximgproc
Call Stack (most recent call first):
cmake/OpenCVModule.cmake:509 (__ocv_sort_modules_by_deps)
cmake/OpenCVModule.cmake:302 (__ocv_resolve_dependencies)
modules/CMakeLists.txt:7 (ocv_glob_modules)
에러 메시지를 잘 보면 dnn, optflow, ximgproc에서 문제가 발생했다는 것을 알수 있다. 이 문제는 ximgproc 모듈이 world 프로젝트에 포함되지 않아서 발생한 문제이다. opencv\modules\ximgproc\CMakeLists.txt 파일을 열어서 아래와 같이 수정한다 (set(OPENCV_MODULE_IS_PART_OF_WORLD OFF)를 #으로 주석처리하고 target_link ... 도 주석처리).
set(the_description "Extended image processing module. It includes edge-aware filters and etc.")
#set(OPENCV_MODULE_IS_PART_OF_WORLD OFF)
ocv_define_module(ximgproc opencv_imgproc opencv_core opencv_highgui opencv_calib3d WRAP python)
#target_link_libraries(opencv_ximgproc)
이후 configure를 해 보면 ximgproc에 대해 dependency를 가지고 있던 dnn 모듈과 optflow 모듈의 에러가 사라짐을 확인할 수 있다. 그런데, 이번에는 xobjdetec에서 다음과 같은 새로운 에러 메시지가 발생한다.
CMake Error at modules/xobjdetect/CMakeLists.txt:4 (add_subdirectory):
add_subdirectory given source "tools" which is not an existing directory.
Call Stack (most recent call first):
modules/world/CMakeLists.txt:13 (include)
modules/world/CMakeLists.txt:26 (include_one_module)
이 에러는 opencv\modules\xobjdetect\tools라는 폴더를 world 프로젝트에서 인식할 수 없기 때문에 발생한 문제이다. 간단하게, opencv\module\xobjectdetect\tools 폴더 전체를 opencv\modules\world\tools로 복사한 후 다시 configure 버튼을 누르면 관련 에러가 사라진다.
그런데, 다운받은 opencv 버전에 따라서 이 외에도 유사한 에러들이 다양하게 발생할 수 있는데 다운받은 버전에서는 아래와 같이 xfeatures2d 에서도 에러가 발생하였다.
CMake Error at modules/xfeatures2d/CMakeLists.txt:4 (include):
include could not find load file:
cmake/download_vgg.cmake
Call Stack (most recent call first):
modules/world/CMakeLists.txt:13 (include)
modules/world/CMakeLists.txt:26 (include_one_module)
CMake Error at modules/xfeatures2d/CMakeLists.txt:5 (include):
include could not find load file:
cmake/download_boostdesc.cmake
Call Stack (most recent call first):
modules/world/CMakeLists.txt:13 (include)
modules/world/CMakeLists.txt:26 (include_one_module)
이 에러도 앞서와 마찬가지로 opencv\modules\xfeatures2d\cmake 폴더 전체를 opencv\modules\world\cmake로 통째로 복사하면 해결된다 (opencv 버전에 따라서 이 외에도 다양한 에러들이 발생할 수 있는데 유사한 방식으로 하면 모두 해결 가능하다).
이상과 같이 하면 일단 configure까지는 성공적으로 완료된다. 이제 cmake의 generate 버튼을 눌러서 visual c++ 프로젝트를 생성한 후 컴파일만 하면 된다. 그런데, build할 폴더에 생성된 OpenCV.sln 파일을 열어보면 opencv_dnn, opencv_saliency, opencv_ts, opencv_world 이렇게 4개의 모듈이 생성되어 있음을 확인할 수 있다 (다운받은 opencv 버전에 따라서 조금씩 차이가 있을 수 있다). 이 말은 dnn, saliency, ts는 world에 포함되지 않고 별도 모듈로 컴파일된다는 의미이다. 따라서, 이 문제를 해결하기 위해서는 cmake의 generate 버튼을 누르기 전에 opencv\modules\saliency\CMakeList.txt 파일을 아래와 같이 수정한다. 즉, saliency 모듈이 world의 일부가 되도록 설정을 수정한다.
set(the_description "Saliency API")
#set(OPENCV_MODULE_IS_PART_OF_WORLD OFF)
ocv_define_module(saliency opencv_imgproc opencv_highgui opencv_features2d WRAP python)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Woverloaded-virtual)
ts 모듈은 opencv 모듈들의 정상 동작을 테스트하기 위한 모듈이기 때문에 굳이 world 모듈에 같이 포함하여 빌드할 필요는 없다 (별도 dll 파일로 빌드하는 것이 바람직하다). 하지만 굳이 world 모듈에 포함하여 빌드하고 싶으면 opencv\modules\ts\CMakeList.txt를 열어서 다음의 두 줄을 주석 처리한다.
#set(OPENCV_MODULE_TYPE STATIC)
#set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
마지막으로 dnn의 경우에는 world에 함께 포함시킬 방법을 찾지 못하였다. 꼭 필요한 경우에는 dnn\cMakeList.txt를 수정해서 방법을 찾아볼 수도 있겠지만 굳이 world 모듈에 포함시킬 필요는 없을 것 같다.
Step 4. OpenCV 프로젝트 생성하기
앞서와 같이 cmake configuration이 모두 끝났다면 generate 버튼을 눌러서 build할 프로젝트를 생성한다.
Step 5. OpenCV 빌드하기
마지막 과정으로, 빌드 폴더에 생성된 OpenCV.sln 파일을 열어서 Visual Studio로 컴파일을 해 보면 수 많은 에러 메시지들을 볼 수 있다 (ㅠ.ㅠ). 예를 들어 xfeatures2d에서 다음과 같은 에러 메시지가 출력될 것이다.
opencv-master\modules\xfeatures2d\src\pct_signatures\distance.hpp(195): error C2653: 'PCTSignatures' : is not a class or namespace name (D:\Downloads\opencv-master\modules\xfeatures2d\src\pct_signatures\pct_clusterizer.cpp)
이러한 문제는 xfeatures2d처럼 모듈의 src 폴더 밑에 별도의 하위 폴더가 존재할 경우에 발생한다 (xfeatures2d는 src\pct_signatures 폴더가 존재). 하위 폴더에 있는 *.cpp 파일을 컴파일할 때 precomp.hpp 파일을 해당 모듈의 파일이 아닌 엉뚱한 path 상의 파일을 읽어들이면서 발생하는 문제이다. 이 문제가 왜 발생하는지는 잘 모르겠지만 해결책은 간단하다. 해당 모듈의 precomp.hpp 파일을 하위 폴더에 복사해서 넣어주면 된다.
- xfeatures2d\src\precomp.hpp 파일을 xfeatures2d\src\pct_signatures\로 복사
- saliency\src\precomp.hpp 파일을 saliency\src\BING\로 복사
이후 컴파일을 진행하면 에러없이 정상 빌드된다 (다운받은 opencv 버전에 따라서 xfeatures2d, saliency 이외 모듈에서도 에러가 발생할 경우에 유사하게 처리해 준다)
이상으로 모든 과정을 완료하였고 빌드 후 결과 폴더에 가 보면 모든 opencv 모듈들이 하나의 world 파일로 합쳐진 것을 확인할 수 있다 (opencv_world310.dll과 opencv_world310.lib).
☞ 보면 문제들이 대부분 path 설정과 관련된 문제들인데, cmake 쪽을 잘 모르다 보니 그냥 땜빵으로 문제를 해결하였습니다. make 파일을 다루시는 분이라면 아마도 좀더 효과적으로 처리하는 방법이 있을 것 같습니다.
by 다크 프로그래머
'프로그래밍 > opencv' 카테고리의 다른 글
OpenCV + Extra Module을 하나의 world 파일로 build하기 (29) | 2016.11.23 |
---|---|
[OpenCV 팁] 이미지 창을 여러개 띄우면서 키보드 메시지 처리하기 (9) | 2015.08.15 |
OpenCV 설치 및 CMake GPU+TBB+IPP 빌드(컴파일)하기 (85) | 2013.10.04 |
OpenCV를 정적 라이브러리(static library)로 사용한 c++ 배포용 프로그램 만들기 (100) | 2013.03.28 |
설정
트랙백
댓글
-
NeoDreamer 2016.11.24 09:26
저도 찾고 있던 정보였는데 이렇게 알게되네요. 좋은 정보 감사드립니다.
-
항상 좋은 정보 감사드립니다.
그런데 Opencv 3.1 과 3.2 버전에서 TBB 까지는 하나의 world파일 생성이 되는데
Cuda (WITH_CUDA, WITH_CUFFT)를 적용해서 컴파일하면 에러가 나는데 혹시 이유를 알고계시거나 해결 경험이 있으신지요. 쿠다툴킷은 cuda_8.0.44_windows7 을 사용했습니다. -
-
아~~ 보시고 계셨군요. 중간에 에러부분이 달라서 글을 쓰다가 BUILD_opencv_dnn 체크를 빼고 하니 위의 글과 내용이 같아져서 내용을 삭제했습니다. 돌 다리도 두들겨 보고 건너라는 옛말이 맞네요.
늘 좋은 글 많이 올려주셔서 감사드리고 관심가져 주셔서 또 한번 감사드립니다. -
OpenCV 3.2(최신버전)과 contrib 최신 버전 설치 후 waitKey() 함수를 이용하여 방향키 입력 시 기능을 구현하려 했더니 작동이 되질 않습니다.
int iKey = waitKey(1);
if (iKey == 0x250000) { x -= 10; }
이렇게 해보니 입력이 들어오질 않습니다. 2.4.13 / 3.1.0 버전은 작동을 합니다. 3.2.0 버전의 버그일까요? 그렇다면
3.1.0 버전에서 이 버전과 호환(?)되는 contrib를 사용할 수 있는 방법이 있을 까요?
3.1.0 Release(Opencv.org) 버전과 github에서 contrib를 다운받아 Youtube에 황선규 교수가 올리신 동영상과 다크님의 방법으로 컴파일 했더니 에러가 많이 나오네요
동영상 : https://www.youtube.com/watch?v=ptvnUCT7wEQ
그냥 2.4.13 버전을 사용하는 것이 나을 까요?
-
다크님 덕분에 최근에 항상 많은 도움을 얻고 있습니다!!
근데 여기서 궁금한게 있는데 step3에서 cmake를 실행하라는게 어떻게 실행하라는 말인가요..? -
ximporc 에러가 나서 설명대로 주석 처리한 뒤 다시 configuration 했더니
Bad modules: opencv_dnn;opencv_tracking;opencv_world
Call Stack (most recent call first):
cmake/OpenCVModule.cmake:509 (__ocv_sort_modules_by_deps)
cmake/OpenCVModule.cmake:302 (__ocv_resolve_dependencies)
modules/CMakeLists.txt:7 (ocv_glob_modules)
이와 같은 에러가 뜹니다. 혹시 조언을 구할 수 있을까요ㅜㅜ -
자료 감사합니다. 지금 열심히 따라하는 중인데요,,
하나 궁금한 것이 있는데 소스코드 다운받은 것은 버전 3.0인가요 3.1인가요
지금 윈도우 32bit visual 2010 환경에서 개발중인데 정상적으로 사용 가능한지 궁금합니다. -
안녕하세요
질문 하나 해도 될런지요
제가 이번에 opencv와 openni 공부를 하고 있는데
visual studio 2017 에 opencv 3.4 와 openni 2.2 를 빌드시켜서 하려고 합니다
카메라는 asus xtion2 입니다
visual studio 에 opencv 는 빌드를 시켜서 예제가 잘 됩니다(openni 도 설정해줬습니다)
그런데 카메라를 연결해서 예제를 돌리면 캠 창이 회색으로 나옵니다 ㅠㅠ
해결 방법이 없나요
asus 에서 제공하는 sdk도 설치해서 해당 응용 프로그램으로 실행하면 카메라가 정상 작동합니다
그런데 visual studio 예제를 사용하면 회색으로 나오더라구요 ㅠㅠ 해결 방법이 없나요
사용한 예제는 opencv 에 있는 openni_capture 예제와 videocapture_basic 예제 사용했습니다 -
안녕하세요.
제가 visual studio 2017로 opencv 3.4.0을 빌드시켜서 예제를 빌드시키고 있었습니다.
빌드 중 imshow 함수로 만든 창이 계속 꺼집니다...
프로젝트 속성에서 하위시스템을 콘솔로 해도 꺼지고 ctrl+f5 키로 빌드시켜도 수치가 나와있는 콘솔창은 유지되는데 imshow 함수로 만든 창은 계속 꺼지네요...
왜 그런 지 이유를 알 수 있을까요? -
-
opencv 4.0 이상의 버전에서도 동일하게 설정하면 되나요?
extra module에서 절실히 필요한 소스 코드가 있는데 (multi camera calibration)
제가 똥손이라 엄청 고생할 것을 각오하고 있습니다. ㅜㅜ