之前都是使用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