1. 程式人生 > >使用VS2017 編寫Linux系統上的Opencv程式

使用VS2017 編寫Linux系統上的Opencv程式

背景

之前寫影象演算法的程式都是在window10下使用VS編寫,VS這個IDE結合“ImageWatch.vsix“外掛,用於除錯opencv相關的影象演算法程式十分方便。後因專案需要,需將相關程式移植到Linux系統,才開始研究如何使用VS編寫Linux上的Opencv程式。

一、Ubuntu安裝相關庫

0/先把ubuntu映象源換成清華的

這樣安裝下載的速度會快些。

1/下載opencv cmake安裝包

2/安裝Cmake

因為可能需要聯合編譯,最好用最新版本,要圖簡單就直接sudo apt-get install cmake 。控制檯輸入:

./bootstrap
make
-j3 sudo make install

3/安裝依賴庫

解壓opencv安裝包,並新建build資料夾,然後在build資料夾路徑下安裝依賴項,控制檯輸入:

sudo apt-get install libeigen3-dev build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb
-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev

4/安裝opencv

配置cmake(簡單的話可以cmake-gui ..然後依次點Configure和Generate按鈕生成Configure檔案),控制檯輸入:

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D WITH_VTK=On -D WITH_V4L=ON -D CMAKE_INSTALL_PREFIX=/usr/local/opencv ..

編譯

sudo make -j3

安裝

sudo make install -j3

5/配置lib庫路徑

在 /etc/ld.so.conf.d/ 路徑下新建了 opencv.conf 檔案(如已有該檔案就不用新建了),

sudo gedit /etc/ld.so.conf.d/opencv.conf

開啟該檔案加入下面的內容:
/usr/local/opencv/lib
然後

sudo ldconfig /etc/ld.so.conf

6/環境變數

對所有使用者有效修改/etc/profile檔案
對個人有效則修改~/.bashrc檔案

sudo gedit /etc/bash.bashrc

在檔案末尾加上
export PKG_CONFIG_PATH=/usr/local/opencv/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/opencv/lib
儲存之後,再使用命令

source /etc/bash.bashrc

7/更新

sudo updatedb 

8/檢查opencv安裝情況

pkg-config –modversion opencv
pkg-config –cflags opencv
pkg-config –libs opencv

9/小程式測試

使用opencv測試程式碼

cd到opencv-3.4.0/smaples/cpp/example_cmake目錄下

cmake .
make
./opencv_example

即可看到打開了攝像頭,在左上角有一個hello opencv 即表示配置成功.

自己編寫程式碼測試

自己建立資料夾,寫個簡單的test1.cpp,然後編譯執行。

a.g++法

然後控制檯輸入:

g++ test1.cpp -o test1 `pkg-config opencv --cflags --libs` -std=c++11
./test1

b.CMakeLists法

先建立CMakeLists.txt檔案

cmake_minimum_required( VERSION 2.8 )
project( test )

# 新增c++ 11標準支援
set( CMAKE_CXX_FLAGS "-std=c++11" )
set(OpenCV_DIR /usr/local/opencv/share/OpenCV)
# 尋找OpenCV庫
find_package( OpenCV REQUIRED )
# 新增標頭檔案
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable( test1 test1.cpp )
# 連結OpenCV庫
target_link_libraries( test1 ${OpenCV_LIBS} )

然後再

mkdir build
cd build
cmake ..
make

這樣就能在build資料夾中生成執行檔案了。
當然如果有條件,大家也可直接安裝Kdevelop這個IDE,使用起來非常方便。

10/安裝錯了,就得解除安裝了重新安裝

進入到build資料夾,控制檯輸入:

make uninstall
cd ..
sudo rm -r release
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv

二、VS新建Linux專案

Visual Studio 從2015開始,就開始支援Linux程式設計,VS2017更不用說(只要安裝的時候注意安裝跨平臺Linux的模組即可)。相關的說明可上官網檢視:https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/
開啟VS,檔案》新建》專案,選擇Visual C++》跨平臺》Linux》控制檯應用程式。
新建Linux專案
VS會自動幫你寫好一個main.cpp,此時直接按F5就能執行除錯,然後需要你輸入Linux系統的IP地址(可在Shell輸入 ifconfig -a查詢),Boot使用者名稱,密碼。
摘取自MSDN
點選確定後,就能直接運行了。
這個時候在Linux系統的/home/下會新建projects資料夾,其中就有VS的新建專案資料夾。

三、VS專案連結Linux的標頭檔案和外接opencv庫

1/連結標頭檔案

由於是在雙系統下程式設計,標頭檔案的作用如下:

  • 在Windows系統下需要標頭檔案來進行程式碼提示
  • 在Linux系統下需要程式連結標頭檔案

1-1 標頭檔案用於程式碼提示

首先將Linux下相關的標頭檔案複製到VS的Linux專案路徑下,既可以直接滑鼠點選複製,也可直接cmd下執行(前提system32下有pscp.exe)

pscp -r 使用者名稱@UbuntuIP地址:/usr/include .

然後將/usr/local/opencv/include(與你之前安裝opencv的設定有關)下的檔案也拷貝到VS的工程目錄下。
然後在專案屬性中設定VC++目錄》包含目錄
包含目錄主要用於程式碼提示

1-2 標頭檔案用於程式執行

程式是在Linux上執行的,也需要標頭檔案,這裡的標頭檔案路徑應是Linux系統上的絕對路徑。在專案屬性中設定 C/C++ 》附加包含目錄,這裡主要填入opencv安裝後的標頭檔案目錄,我這裡是
/usr/local/opencv/include
/usr/local/opencv/include/opencv
/usr/local/opencv/include/opencv2
具體的路徑根據你安裝opencv確定。
C++編譯器選為g++
附加包含目錄才用於Linux程式執行

2/連結外部opencv庫

2-1 設定“附加”庫目錄

連結外部opencv庫,之前我一直在VC++目錄下設定 庫目錄,後來發現根本沒用
後來發現,凡是需要遠端在Linux系統上執行的,都必須設定在 “附加“裡面。故,**Linux的庫目錄也必須設定在“附加庫目錄”裡面,裡面填寫的是opencv相關庫在Linux下的絕對路徑。
跟Linux相關都藥設定“附加*”
這裡我填寫
/usr/local/opencv/lib

2-2 設定庫依賴項

這裡跟windows下設定類似,在聯結器》輸入》庫依賴項中,填寫可能用到的opencv庫名稱(注意這裡的名稱是去掉“lib”字首和”.a”/”.so”尾綴的庫名稱)。
這裡寫圖片描述
我這裡填入:

opencv_calib3d
opencv_core
opencv_dnn
opencv_features2d
opencv_flann
opencv_highgui
opencv_imgcodecs
opencv_imgproc
opencv_ml
opencv_objdetect
opencv_photo
opencv_shape
opencv_stitching
opencv_superres
opencv_video
opencv_videoio
opencv_videostab

3/小程式測試

隨便在main.cpp中寫個小程式測試一下:

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

using namespace std;
using namespace cv;

int main()
{
    printf("hello from UbuntuTestified!\n");
    Mat srcImage = imread("11.jpg");
    imshow("testImg2", srcImage);

    waitKey(5000);

    return 0;
}

按F5生成一下……怎麼沒反應?別急,VS是在Windows系統,生成的程式是在Linux系統,自然不能在windows下顯示效果(但文字顯示可以)。
直接到Linux系統下,該程式的生成路徑下(…\bin\release或debug)開啟,記得把命名為”11.jpg”的圖片也放入該路徑下。
這樣程式就能正常運行了。
Linux下執行opencv程式效果