Visual Studio Code 安裝C++ 連結opencv環境

之前都是使用Anaconda中的Spyder編譯器寫python,後來改用Visual studio Code 後便離不開了,但最近又要改到C編寫程式碼,用慣了vs code的我實在很懶得再去下載超大型編譯器–visual studio,爬文說vs code也可以順利的編譯C++環境,只要調整一些設定即可,因此就開啟我的配置環境之路了,配的過程中滿腹荊棘,許多人都是貼個設定而已並沒有講解一些相關原理,因此操作過程中滿是疑惑,經過幾點的摸索後漸漸懂得配置方法,因此特此紀錄下來,希望給過來人一個簡便的教學。

  • 作業系統: Ubuntu 16.04
  • opencv版本: 3.1.0
  • gcc版本 :gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0

1.VS code 安裝相對應package

vs code就是sublime編譯器的進化版,和sublime一樣,vs code擁有許多外掛程式包,將這些外掛程式包安裝後就可以讓編譯器的功能再更強大,由於接下來我們要用vs code編譯C++程式碼,因此把滑鼠點向extensions(最左下角圖示)然後搜尋C++,把前面三個包都安裝好,分別是

  • c/c++
  • c++ Intellisense
  • c/c++ Clang Command Adapter

2.build opencv from source

第二個步驟即是下載opencv原始碼,然後開始利用cmake來編譯出系統需要的動態library,在Ubuntu中後輟為—.so,在windows中後輟為—.dll,通過連結編譯出的動態library與head檔並在程式碼中include即可使用Opencv這個大型函式庫。

  • 底下為建置出的library
  • Cmake小介紹:
    CMake 為 “Cross Platform Make”的縮寫, 是一個開放原始碼的跨平台的自動化建置系統。以往開發人員寫程式時,在windows寫的程式碼若要搬到不同的作業系統(linux)上可能就要重新寫一份,有了cmake之後即可擁有一份原始碼就能做到任意的建置不同作業系統連結library的功能,大大節省了許多寶貴時間,

a.Download openv source code

b.Download opencv contrib source code

c.安裝相依元件

$ sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

$ sudo apt-get install python3.5-dev python3-numpy libtbb2 libtbb-dev

$ sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libdc1394-22-dev libeigen3-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev sphinx-common libtbb-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libavutil-dev libavfilter-dev libavresample-dev

d.使用cmake建置出library

下載後的opencv原始檔解壓縮後呈現的檔案夾如下,在裡面新增一個名為release(可以自己取)的檔案然後使用cmake指令在release中編譯出動態lib資料夾

#進入opencv下載資料夾中
/opt$ cd opencv
#創造名為release的資料夾
/opt/opencv$ mkdir release
#進入release 資料夾中
/opt/opencv$ cd release
#使用cmake指令編譯,前面的項目為參數,最後面是放置CMakeLists.txt的檔案位置,編譯cmake指令必須有此檔才能讓cmake運作,這裡opencv原始碼已經寫好了,直接使用即可
/opt/opencv/release$ cmake -D BUILD_TIFF=ON -D WITH_CUDA=OFF -D ENABLE_AVX=OFF -D WITH_OPENGL=OFF -D WITH_OPENCL=OFF -D WITH_IPP=OFF -D WITH_TBB=ON -D BUILD_TBB=ON -D WITH_EIGEN=OFF -D WITH_V4L=OFF -D WITH_VTK=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv_contrib/modules /opt/opencv/
# 經過剛剛的步驟後會產生makefile檔,這個makefile檔還不是要編譯出的動態library,必須再下make 指令才會開始編譯,-j後面的數字代表用幾顆CPU下去跑
/opt/opencv/release$ make -j4
# 到此步驟,所有編譯的資料都會再realse資料夾中產生,後續進行的是把這些環境安裝到系統環境中 (usr/local/lib usr/local/include)
/opt/opencv/release$ make install
# 建立系統連結
/opt/opencv/release$ ldconfig
  • 若上述過程順利的話,應該就可以看到如以下成功畫面,當然也可能會出現錯誤,這時候就要乖乖爬文解決了…

3.連結vs code

連結的方法有兩個,一個是製造出json檔案,另一個是使用cmake編譯出執行檔然後才執行debug模式,剛開始爬文的時候發現教學都是使用json檔來建立連結,但這在換opencv環境的時候會很麻煩,所有的動態連結檔都要重新打一次,因此我會強烈推薦用第二個方法–使用cmake製造出執行檔

Method1: json file

使用此方法共要建置出三個json檔案,分別是

  • c_cpp_properties.json:
  • tasks.json
  • launch.json

前面兩個

a.開新檔案

粘貼以下程式碼並貼在新檔案中

#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <iostream>
using namespace cv;

using namespace std;
int main()
{    
    Mat img=imread("lena.jpg");
    cv::imshow("image",img);
    cv::waitKey();
    system("pause");
    return 0;    
}

b.生成launch.json

直接執行會提示需要生成相對應的launch.json檔(選擇GDB),並把以下程式碼對launch.json進行覆蓋,此json檔代表告訴程式要使用哪個做為debug用,通常在linux中都是選擇gdb,而在windows中通常會安裝mingw,裡面就包含gdb.exe程式

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [              
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.o",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "preLaunchTask": "build",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        },
    ]
}

c.創造tasks.json

之後按ctrl+shift+b 選擇others會製造出tasks.json檔,同樣的複製以下程式碼進行覆蓋

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileBasenameNoExtension}.o",
                "-I",
                "/usr/local/include",
                "-I",
                "/usr/local/include/opnecv",
                "-I",
                "/usr/local/include/opnecv2",
                "-L",
                "/usr/local/lib",
                "-l",
                "opencv_core",
                "-l",
                "opencv_highgui",
                "-l",
                "opencv_imgproc",
                "-l",
                "opencv_imgcodecs",
                "-l",
                "opencv_stereo"
            ],
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}

d.創造 c_cpp_properties.json

在同個資料中創造c_cpp_properties.json並複製以下程式碼

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": ["/usr/local/include",
                "/usr/local/include/opencv",
                "/usr/local/include/opencv2",
                "/usr/local/lib",
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

Method 2 :cmake 編譯

使用cmake編譯的好處在於可以隨意的置換版本,只要在cmake的指令前面加上
Package_Dir=…/ cmake ,即可優先使用此環境編譯

因此編譯opencv的指令如下:假設突然要換成opencv4.1.0版本

OpenCV_DIR=/home/testlinux/Darren/opencv/opencv-4.1.0/release cmake ../

a.創造CMakeLists.txt檔案並填入以下資訊

cmake_minimum_required(VERSION 2.8)
project( project_name)

# 加入這三行代表可以使用debug模式
SET(CMAKE_BUILD_TYPE "Debug ")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

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})

add_executable( project_name test.cpp )
target_link_libraries(sgbm ${OpenCV_LIBS})

b.編譯出makefile檔

cmake .

c.開始編譯

make

4.參考資料:

https://github.com/opencv/opencv/issues/6016
https://github.com/opencv/opencv/issues/6016
http://www.codebind.com/cpp-tutorial/install-opencv-ubuntu-cpp/
https://www.cnblogs.com/zhxilin/p/5881080.html
https://www.jianshu.com/p/ccc83c9d3332
https://www.hahack.com/codes/cmake/#%E5%B0%86%E5%85%B6%E4%BB%96%E5%B9%B3%E5%8F%B0%E7%9A%84%E9%A1%B9%E7%9B%AE%E8%BF%81%E7%A7%BB%E5%88%B0-cmake
https://zhuanlan.zhihu.com/p/50829542

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments