서론
몇가지 방법을 시도했는데, 다 실패하고 cmake로만 성공했다. python에 비해서 c++은 참고 자료가 적다. 아무래도 영상처리는 파이썬을 많이 쓰니..
주의! cmake에서 바이너리 빌드하는데 상당히 오래걸린다. (제 노트북으로 3시간 이상 소요되었습니다.)
컴파일러 설치
C++ 컴파일러는 mingw-w64를 쓴다. mingw가 아니다. mingw가 이미 설치되어있다면 cmake에서 빌드할때 mingw가 아닌 mingw-w64를 인식시키기 위해 컴파일러를 별도로 설정해야하고 vs code에서도 별도 설정해줘야한다. 개인적으로는 이 과정이 안해봐도 번거로워서 설치되어있던 mingw를 삭제했다.
(mingw-w64는 64비트 용이고 mingw는 32비트용이고 그런것은 아니다. 둘은 서로 다른 회사(?)가 만들었다.)
mingw-w64인스톨러를 다운받고 설치한다.
https://sourceforge.net/projects/mingw-w64/
설치시 세팅은 아래와 같이 설정한다.
만약 설치가 되지 않는다면, 아래 사이트에서 압축파일을 다운받은 후 환경변수를 직접 세팅하여 사용할 수 있다.
https://sourceforge.net/projects/mingw-w64/files/
설치후 터미널에 gcc –version을 입력하여 올바르게 설치되었는지 확인한다.
만약 gcc명령어가 없다고 뜬다면 환경변수에 mingw-w64가 있는지 확인하고 없다면 입력한다.
환경변수는 제어판 -> 시스템 -> 고급 시스템 설정에 있다.
cmake 설치, 빌드
cmake를 다운받고 설치한다.
opencv 소스코드를 다운받는다.
https://github.com/opencv/opencv/releases
opencv 깃헙으로 이동 후 Releases에서 받는다.
마찬가지로 opencv contribute도 받는다.
opencv와 opencv contribute의 버전은 같아야 한다.
https://github.com/opencv/opencv_contrib/
cmake 실행 후 where is the source code에 다운받은 opencv 소스코드, where to build the binaries에 빌드된 결과가 저장될 임의의 경로를 입력하고 configure를 선택한다.
제네레이터 선택창이 나오면 mingw를 선택한다.
configure가 완료되면 사용하지 않는 라이브러리들을 체크해제하여 빌드에 포함시키지 않을 수 있다.
보통은 아래의 라이브러리들을 제외한다.
search에 입력하면 쉽게 찾을 수 있다.
configure를 한번 더 해주고 search에 extra를 입력후 다운받은 opencv contribute내 module 경로를 지정한다.
다시 configure를 해주고 이번엔 라이브러리에 포함할것을 체크한다.
다시 configure 후 search에 install을 입력하고 바이너리가 최종 저장될(보관할) 경로를 지정한다.
configure 후 generate를 수행한다.
generate가 완료되면 cmake는 종료한다.
명령 프롬프트를 열고 cmake에서 where to build the binaries에서 지정했던 바이너리 저장 경로로 이동 후 아래 명령어를 입력한다.
$ mingw32-make
$ mingw32-make install
Visual Studio Code 설정
Visual Studio Code 설치 후 extension으로 이동하여 c를 입력 후 c extension pack을 설치한다.
vscode에서 opencv 테스트를 위한 폴더를 새로 생성 후 열고
키보드 F1 -> Tasks Configure Task -> Create tasks.json file from template -> Others를 선택하여 tasks.json을 생성한다.
tasks.json은 아래의 내용으로 교체한다.
{ "version": "2.0.0", "runner": "terminal", "type": "shell", "echoCommand": true, "presentation" : { "reveal": "always" }, "tasks": [ { "label": "compile for C++", "command": "cd ${fileDirname} && cmake . -G \"MinGW Makefiles\" && mingw32-make", "group": "build", "problemMatcher": { "fileLocation": [ "relative", "${workspaceRoot}" ], "pattern": { "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } } }, { "label": "execute", "command": "cmd", "group": "test", "args": [ "/C", "${fileDirname}\\${workspaceFolderBasename}" ] } ] }
빌드, 실행을 위한 단축키를 설정한다.
keyboard Shortcuts으로 이동
Keybinding.json으로 이동
Keybinding.json에서 아래와 같이 내용을 교체한다.
ctrl+art+c를 빌드, ctrl+art+s를 run으로 설정했으며 변경 가능하다.
[ { "key": "ctrl+alt+c", "command": "workbench.action.tasks.build" }, { "key": "ctrl+alt+s", "command": "workbench.action.tasks.test" } ]
폴더에 CMakeLists.txt파일을 생성 후 아래 내용을 작성한다.
이때
set(pathOPENCV C:/opencv-mingw/build)에는 cmake에서 지정한 바이너리 경로
set(LIBOPENCV ${pathOPENCV}/x64/mingw/lib/libopencv_world460.dll.a)의 460은 opencv 버전을 입력한다.(460은 4.6.0)
cmake_minimum_required(VERSION 2.8) set(pathOPENCV C:/opencv_mingw/build) include_directories(${pathOPENCV}/include) set(LIBOPENCV ${pathOPENCV}/x64/mingw/lib/libopencv_world460.dll.a) get_filename_component(ProjectId ${CMAKE_CURRENT_LIST_DIR} NAME) string(REPLACE " " "_" ProjectId ${ProjectId}) project(${ProjectId} C CXX) set (CMAKE_CXX_STANDARD 11) file(GLOB SOURCES *.cpp) add_executable(${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} ${LIBOPENCV} )
테스트용 main.cpp를 작성한다.
테스트를 위해 폴더에 test.jpg라는 아무 이미지 파일을 넣어둔다.
#include "opencv2/opencv.hpp" #include<iostream> #include<stdio.h> using namespace std; int main(int arg, char** argu) { cv::Mat img = cv::imread("test.jpg"); imshow("img", img); cv::waitKey(0); return 0; }
cmake에서 지정했던 opencv빌드 결과 폴더로 가서 (ex C:\opencv_mingw\build\x64\mingw\bin)
libopencv_world460.dll 파일을 main.cpp와 같은 경로에 넣는다.
main.cpp에서 ctrl+art+c, ctrl+art+s를 입력하여 빌드, 실행한다.