반응형

Visual Studio Code에서 손쉽게 OpenCV 코드를 컴파일하고 테스트하는 방법을 다룹니다.


2020. 12. 6 최초작성




윈도우 환경에서 C++로 작성된 OpenCV 코드를 컴파일하기 위해 보통  Visual Studio를 설치하여 사용합니다. 

하나의 프로젝트만 진행하는 경우에는 Visual Studio에서 제공하는 개발환경이 필요할 수 있습니다.


하지만 간단히 테스트용으로 사용시에는 매번 Visual Studio에서 프로젝트 생성하고 OpenCV를 설정하는게 번거롭습니다.

예전에 MinGW용으로 OpenCV를 빌드하여 Visual Studio Code에서 사용하는 방법을 소개했었습니다. 


MinGW + Visual Studio Code에서 OpenCV 사용하는 방법

https://webnautes.tistory.com/1344



이 방법을 사용하면 OpenCV 코드를 컴파일시 가벼운 Visual Studio Code를 사용할 수 있지만  MinGW용으로 OpenCV를

빌드해야 하는 수고가 따릅니다.  



그래서 이번엔 미리 빌드되어 배포되는 MinGW용 OpenCV를 찾아서 Visual Studio Code에서 사용하는 방법을 소개합니다. 

CMake 빌드 스크립트를 개선하여 하나의 Visual Studio Code  프로젝트(=처음 만든 폴더)에 하위 폴더 별로 OpenCV 코드를 두고 각각 컴파일하여 테스트할 수 있도록 했습니다.

하위 폴더 별로 OpenCV DLL 파일을 넣어두어야 실행이 가능합니다. 이 부분을 해결하는 것은 이후로 미룹니다.



 

1. 아래 링크에서 OpenCV 4.1.1-x64 항목에 보이는 zip를 클릭하여 다운로드합니다. 

https://github.com/huihut/OpenCV-MinGW-Build




아래처럼 contrib를 포함시킨 최신 버전도 존재하지만 x86용 MinGW로 OpenCV를 빌드해서 사용하지 않았습니다.

필요하면 아래 버전으로 다운로드 후, 본 포스트의 내용을 약간 수정하여 진행하면 테스트 가능할 듯합니다. 

컴파일러는 MinGW-x86-7.3.0을 사용해야 합니다. 주의할 점은 64비트용이기 때문에 32비트에서는 동작하지 않습니다.

 



2. 다운로드 받은 압축파일을 풀어서 c:\ 위치에 다음처럼 복사해둡니다.

본 포스트에서는 폴더 이름을 opencv-4.1.1-mingw로 정했다고 가정하고 진행합니다.





3. 아래 링크에서 MinGW x86_64-posix-seh를 다운로드 받아야 합니다. OpenCV를 빌드할때 사용했다고 명시된 컴파일러입니다. 

다른 버전을 사용하면 문제가 생길 수 있습니다.

https://sourceforge.net/projects/mingw-w64/files/






4. c:\ 위치에 mingw64 이름으로 복사해두세요. 





5. 환경 변수 PATH에 MinGW의 bin 폴더를 추가해야 합니다.


윈도우 키 + R을 눌러서 보이는 실행창에서 sysdm.cpl를 입력하고 엔터를 누릅니다. 

 

 

 

고급 탭을 클릭하고 아래 보이는 환경 변수 버튼을 클릭합니다. 

 

 

 

시스템 변수에서 Path를 선택하고 편집 버튼을 클릭합니다. 

 

 

 

새로 만들기 버튼을 클릭한 후.. 맨 아래에 다음 경로를 입력합니다.

C:\mingw64\bin

 

 

 

윈도우 키 + R을 입력 후, cmd 엔터를 눌러서 실행되는 명령 프롬프트 창에서 

다음처럼 gcc -v 명령이 실행 가능해지는지 확인하세요.

 

 

 

 

6. 다음 포스트를 참고하여 Visual Studio Code를 설치하세요.


Visual Studio Code 설치하는 방법( Windows / Ubuntu )

https://webnautes.tistory.com/1197 




7. CMake를 설치합니다.

https://cmake.org/download/ 





 설치 진행 중 “Add CMake to the system PATH for all users”를 체크해야 합니다. 





8. 탐색기 아이콘을 클릭하고 폴더 열기를 클릭합니다. 





9.원하는 위치로 이동 후, 새 폴더를 클릭하여 새로운 폴더를 생성합니다. 





새로 생성한 폴더로 이동 후, 폴더 선택을 클릭합니다.





10. “새 폴더” 아이콘을 클릭한 후, 폴더 이름 webcam-test-1을 입력 후, 엔터를 누릅니다. 





11. 새로 생성된 폴더 webcam-test-1을 한번 클릭한 후, 새파일 아이콘을 클릭하고 파일 이름 main.cpp를 입력 후, 엔터를 누릅니다.




새로 생성된 main.cpp에 다음 코드를 복사하여 붙여넣기 하고 Ctrl + S를 눌러 저장합니다. 


#include "opencv2/opencv.hpp"
#include <iostream> 
 
using namespace cv; 
using namespace std
 
 
 
int main(int, char**) 


    VideoCapture cap(0); 
    if (!cap.isOpened()) 
    { 
        printf("카메라를 열수 없습니다. \n"); 
    } 
 
 
    Mat frame; 
    namedWindow("camera1", 1); 
 
 
    for (;;) 
    { 
 
        cap >> frame; 
 
        imshow("camera1", frame); 
 
        if (waitKey(20) >= 0) break
    } 
 
 
    return 0
}  




오른쪽 아래에 다음 다이얼로그가 보이면 Install을 클릭해야 합니다. 이후 과정은 설치가 완료된 후 진행해야합니다.





12. 메뉴에서 터미널 > 기본 빌드 작업 구성을 선택합니다. 


다음 항목들이 보이면 g++.exe를 클릭합니다.




다음 선택 화면이 추가로 보일 수 있습니다.


템플릿에서 tasks.json 파일 만들기를 선택합니다. 

 

 

 

Others를 선택합니다.

 




탐색기의 .vscode 폴더에   tasks.json 파일이 추가되고 편집기에서 해당 파일이 열립니다.

 




13. 편집기에 열린 tasks.json 파일을 다음 내용으로 대체하고 Ctrl +S를 눌러 저장합니다.


{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          //C++ 컴파일
          {
            "label": "compile for C++",
            "command": "cd ${fileDirname} && cmake . -G \"MinGW Makefiles\" && mingw32-make",
            "group": "build",

            //컴파일시 에러를 편집기에 반영
            //참고:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression.
                  //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // 바이너리 실행(Windows)
        {
            "label": "execute",
            "command": "cmd",
            "group": "test",
            "args": [
                "/C", "${fileDirname}\\${relativeFileDirname}"
            ]
        }
    ]
}





14.  IntelliSense 구성을 설정해야 합니다.  Ctrl + Shift + P를 눌러서 보이는 입력 창에 c/c++을 입력한 후, C/C++: 구성 편집(UI)를 선택합니다. 

 

 

 

컴파일러 경로를 g++.exe로 변경합니다. 

 




IntelliSense 모드를 gcc-x64로 변경합니다. 





경로 포함에 다음 경로를 추가합니다. 


C:\opencv-4.1.1-mingw\include




자동으로 설정이 저장되므로 이 페이지를 그냥 닫아도 됩니다. 





15. 새파일 아이콘을 클릭하고 파일 이름 CMakeLists.txt를 입력 후, 엔터를 누릅니다.




파일 내용을 다음 내용으로 대체하고 Ctrl + S를 눌러 저장합니다. 


cmake_minimum_required(VERSION 3.0)

set(OpenCV_DIR C:/opencv-4.1.1-mingw/)
find_package( OpenCV REQUIRED )


message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

include_directories(${OpenCV_INCLUDE_DIRS})


get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId})

set (CMAKE_CXX_STANDARD 11)

file(GLOB SOURCES  *.cpp)

add_executable(${PROJECT_NAME} ${SOURCES} )
target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS})




16. 메뉴에서 파일 > 기본 설정 > 바로 가기 키를 선택합니다. 

캡처화면에 빨간색 사각형으로 표시한 아이콘을 클릭합니다.





다음 내용으로 대체하고 Ctrl + S를 눌러 저장합니다. 


// 키 바인딩을 이 파일에 넣어서 기본값을 덮어씁니다.
[
    //컴파일
    { "key": "ctrl+alt+c", "command": "workbench.action.tasks.build" },
   
    //실행
    { "key": "ctrl+alt+r", "command": "workbench.action.tasks.test" }
]




17. 이제 빌드를 해봅니다. main.cpp 파일을 선택하여 화면에 코드가 보이도록 합니다. 

Ctrl + Alt + C를 누른 후, Visual Studio Code 상단 중앙에 보이는 compile for C++를 선택합니다.




다음처럼 빌드가 진행됩니다. 


> Executing task: cd d:\work\code\opencv-mingw\webcam-test-1 && cmake . -G "MinGW Makefiles" && mingw32-make <

-- The CXX compiler identification is GNU 8.1.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/mingw64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- OpenCV ARCH: x64    
-- OpenCV RUNTIME: mingw
-- OpenCV STATIC: OFF  
-- Found OpenCV: C:/opencv-4.1.1-mingw (found version "4.1.1")
-- Found OpenCV 4.1.1 in C:/opencv-4.1.1-mingw/x64/mingw/lib
-- You might need to add C:/opencv-4.1.1-mingw/x64/mingw/bin to your PATH to be able to run your applications.
-- OpenCV library status:
--     version: 4.1.1
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
--     include path: C:/opencv-4.1.1-mingw/include
-- The C compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/work/code/opencv-mingw/webcam-test-1
Scanning dependencies of target webcam-test-1
[ 50%] Building CXX object CMakeFiles/webcam-test-1.dir/main.cpp.obj
[100%] Linking CXX executable webcam-test-1.exe
[100%] Built target webcam-test-1



현재 폴더에 실행파일이 생성됩니다.





18. C:\opencv-4.1.1-mingw\x64\mingw\bin에 있는 dll 파일을 현재 폴더로 복사해옵니다. 

dll 파일을 모두 선택 후, ctrl 을 누른 상태에서 Visual Studio Code의 탐색기창에 드래그앤 드롭하면 dll 파일들이 복사됩니다. 






19. ctrl + alt + r을 눌러서 실행해봅니다. 웹캠이 PC에 연결되어 있어야 동작합니다. 

Visual Studio Code 상단 중앙에 보이는 execute를 클릭합니다. 



웹캠 영상을 볼 수 있습니다.



20. 이제 새로운 OpenCV 예제를 테스트하려면 탐색기 아래에 보이는 빈 공백을 클릭합니다. 

이래야 새로운 폴더를 루트 폴더 아래에 생성할 수 있습니다.





21. 새 폴더 아이콘을 클릭하고 새로운 폴더 이름을 적은 후, 엔터를 누릅니다. 





22. 새로 생성한 폴더에 소스코드 파일과 CMakeLists.txt 파일을 생성하고 빌드하면 exe 파일이 현재 폴더에 생성됩니다. 




실행을 위해 필요한 DLL 파일을 복사해와야 합니다. 

앞에서 만든 프로젝트 폴더에서 DLL 파일을 모두 선택한 후, Ctrl을 누른 채, 현재 폴더로 드래그앤드롭하면 복사가 됩니다. 






진행 해보고,  문제가 생기거나 개선 사항이 있으면  언제든 댓글로 남겨주세요.  



이미지 같은 파일들을 불러오려면 현재 실행 파일의 위치를 기준으로 가져와야 합니다. 

별도의 폴더에 프로젝트 파일들이 위치하고 있지만 Visual Studio Code에서는 부모 폴더 이름을 기준으로 파일들을 가져오려고 하기 때문입니다. 

아래 포스트를 참고하여 이미지 파일을 로드시 경로 앞에 현재 실행파일의 경로를 추가해주세요. 


C/C++ - 실행 파일의 절대 경로 얻는 방법 ( realpath, GetModuleFileName )

https://webnautes.tistory.com/1448




반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. Favicon of https://thedaftpigeon.tistory.com BlogIcon The Daft Pigeon 2020.12.30 15:41 신고

    감사합니다 항상 잘 보고있습니다

  2. Favicon of https://developer-ai.tistory.com BlogIcon AI 로밧 2021.03.26 00:08 신고

    안녕하세요. 예전 opencv를 이용해 처음 공부했던 2년 전 부터 기본 외곽선 검출, 색감변환, 캠 이용해서 색감 찾기 등 많이 배워왔습니다.

    다만 얼마전 회사에 입사해서 CMake를 이용하여 이 포스트의 내용을 따라 환경 설정 중인데,

    이상하게 계속 17번 단계에서 컴파일하게 되면 다음과 같이
    ------------------------------------------------------------------------------------------------------------------------
    > Executing task: cd C:\opencv-mingw\webcam-test-1 && cmake . -G "MinGW Makefiles" && mingw32-make <

    'cmake'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
    배치 파일이 아닙니다.
    터미널 프로세스 "C:\WINDOWS\System32\cmd.exe /d /c cd C:\opencv-mingw\webcam-test-1 && cmake . -G "MinGW Makefiles" && mingw32-make"을(를) 시작하지 못했습니다(종료 코드: 1).

    터미널이 작업에서 다시 사용됩니다. 닫으려면 아무 키나 누르세요.
    ------------------------------------------------------------------------------------------------------------------------
    이런 에러가 자꾸 나오네요..

    어떻게 경로가 잘못 된건지... 똑같은 폴더명, 파일명으로 실행해봤는데도 자꾸 에러가 납니다.. 혹시 조언해주실 수 있으신지요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.03.26 07:53 신고

      윈도우용 cmake가 설치안되었거나 환경변수 path에 추가안된듯합니다

  3. Favicon of https://strawberrysmoothie123.tistory.com BlogIcon 딸기스무디 2021.04.11 16:40 신고

    감사합니다. 덕분에 환경 설정 잘 마쳤습니다.
    gstreamer pipeline으로 영상을 전송하려 하는데 VideoWriter가 열리지 않아 여쭤봅니다..


    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/videoio.hpp>

    using namespace cv;
    using namespace std;

    int main()
    {

    cv::VideoCapture cap;
    cap.open(0);
    if(!cap.isOpened()) {
    cout << "Failed to open camera" << endl;
    return -1;
    }

    const string gst_pipline_0 = "appsrc ! videoconvert ! udpsink host=127.0.0.1 port=9666";

    VideoWriter video_write(gst_pipline_0, 0, 25, Size(640, 480), true);
    if (!video_write.isOpened()) {
    cout<<"Failed to open VideoWrite";
    return -1;
    }

    cv::Mat frame;
    while (true) {
    cap.read(frame);
    video_write.write(frame);

    if (waitKey(1) == 27) { //ESC
    break;
    }
    }

    return 0;
    }

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2021.04.11 16:45 신고

      안해본 부분이라 답변이 어렵습니다. 구글에서 검색해보니 하시는 방식으로 영상전송을 한분이 있네요.

      https://m.blog.naver.com/PostView.nhn?blogId=jedijaja&logNo=221278212074&proxyReferer=https:%2F%2Fwww.google.com%2F

    • Favicon of https://strawberrysmoothie123.tistory.com BlogIcon 딸기스무디 2021.04.11 17:03 신고

      답변 감사합니다

+ Recent posts