1. 程式人生 > >Linux Ubuntu 下編譯Opencv c++專案的幾種方法

Linux Ubuntu 下編譯Opencv c++專案的幾種方法

Table of Contents

4.瞭解

1.使用g++命令列 pkg-config引數方法

新建一個cpp檔案:main.cpp,功能是輸入一幅影象檔案的路徑並顯示該影象:

#include<opencv2/opencv.hpp> 
#include<string>
#include<iostream>
using namespace std;
using namespace cv;//下面的所有cv相關型別不用加上字首了 
int main(int argc,char** argv)
{ 
	string filename;
	cout<<"please input the image file path:"<<endl;
	cin>>filename;
	Mat img =imread(filename);//宣告Mat變數,並讀取圖片,imread中需要傳入圖片的絕對路徑 
	if(img.data==NULL)
	{
		cout<<"image is not exit"<<endl;
		return 0;
	}

	// Create a window
    	static const std::string kWinName = "show an image";
    	namedWindow(kWinName, WINDOW_NORMAL);
	imshow(kWinName,img);//在視窗中顯示載入的圖片 
	waitKey();//等待按鍵 
	return 0; 
}

然後使用g++ 帶pkg引數命令編譯 Opencv 的C++檔案:

sudo  g++ main.cpp -o main `pkg-config --cflags --libs opencv`

然後成可執行的main檔案。

注意1:許可權問題:不加sudo 編譯報錯:
/usr/local/lib/libopencv_imgcodecs.so:對‘[email protected]_4.0’未定義的引用
參考:https://blog.csdn.net/cfyzcc/article/details/52981467  
得以解決

注意2:`與' 的區別     英文狀態下數字1左邊的鍵盤是~和`,不要誤用成單引號'了。

注意3:這實質是g++編譯命令中 -I與-L引數打使用。

然後在當前路徑下執行mian檔案:

$ ./main
./main: /home/yang/anaconda2/lib/libtiff.so.5: no version information available (required by /usr/local/lib/libopencv_imgcodecs.so.3.4)
please input the image file path:
dog.jpeg

1.2pkg-config 官網與說明

pkg-config介紹:

pkg-config is a helper tool used when compiling applications and libraries.

It helps you insert the correct compiler options on the command line so an application can use gcc -o test test.c `pkg-config --libs --cflags glib-2.0` for instance, rather than hard-coding values on where to find glib (or other libraries). It is language-agnostic, so it can be used for defining the location of documentation tools, for instance.

pkg-config是編譯應用程式和庫時使用的輔助工具。 它可以幫助您在命令列中插入正確的編譯器選項,以便應用程式可以使用gcc -o test test.c`pkg-config --libs --cflags glib-2.0`,而不是硬編碼值在哪裡找到glib(或其他庫)。 它與語言無關,因此可用於定義文件工具的位置。

pkg-config 使用示例:

gcc Test.c -o Test `pkg-config --cflags --libs opencv`
./Test baboon.jpg

在上面的編譯命令中我們其實用到了一個工具“pkg-config”,它主要有以下幾個功能:

  1. 檢查庫的版本號。如果所需要的庫的版本不滿足要求,它會打印出錯誤資訊,避免連結錯誤版本的庫檔案。
  2. 獲得編譯預處理引數,如巨集定義,標頭檔案的位置。
  3. 獲得連結引數,如庫及依賴的其它庫的位置,檔名及其它一些連線引數。
  4. 自動加入所依賴的其它庫的設定

  所有有了這個工具之後我們的編譯就很方便了(不過在此之前你要確保你安裝的OpenCV的安裝連結庫檔案的目錄下有一個pkgconfig資料夾,在該資料夾裡面有個opencv.pc的檔案,其實這就是pkg-config下OpenCV的配置檔案)。

  使用pkg-config時,選項--cflags 它是用來指定程式在編譯時所需要標頭檔案所在的目錄,選項 --libs則是指定程式在連結時所需要的動態連結庫的目錄,如下是我的PC上安裝的Opencv的include和lib目錄:

$ pkg-config --cflags opencv
-I/usr/local/include/opencv -I/usr/local/include

$ pkg-config --libs opencv
-L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core

2.OpenCV推薦的CMake工具

step1:新建一個目錄用於存放我們的程式碼和程式中要處理的相關圖片

step2:新增cmake工具編譯時所需的檔案CMakeLists.txt

注:這個檔案你可以到你的OpenCV原始碼解壓出來的資料夾下的/samples/c/example_cmake/資料夾下拷過來,然後再做修改

為修改檔案如下:

# cmake needs this line
cmake_minimum_required(VERSION 2.8)

# Define project name
project(opencv_example_project)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

if(CMAKE_VERSION VERSION_LESS "2.8.11")
  # Add OpenCV headers location to your include paths
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()

# Declare the executable target built from your sources
add_executable(opencv_example example.cpp)

# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS})

根據你的專案名稱和該專案裡包含的原始碼檔案 修改如下:

# cmake needs this line
cmake_minimum_required(VERSION 2.8)
#這是對CMake工具最低版本要求,這裡我們要檢查下我們的CMake工具的版本資訊,我們可以使用命令“cmake --version”檢視

# Define project name
project(opencv_example)
#//這是建立一個工程專案(類似於我們VS中建立C++專案一樣),括號裡面時工程名,工程名我們可以任意給,最後程式編譯出來的可執行檔案就是這個名字

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)  #這是cmake用來查詢opencv包用的,

# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

if(CMAKE_VERSION VERSION_LESS "2.8.11")
  # Add OpenCV headers location to your include paths
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()

# Declare the executable target built from your sources
add_executable(opencv_example main.cpp) #這裡括號裡面的兩個引數分別是工程專案名和我們要編譯檔名的意思,記住中間一空格鍵隔開

# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS}) #這是我們連結到OpenCV庫的環節,我們只要更改前面第一個引數為我們的工程專案名即可

然後我們就將終端的工作目錄切換到我們建立工程檔案的這個目錄

Step3:讓後我們輸入命令"cmake ."對當前的工程進行編譯。

$ cmake .
cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by cmake)
-- OpenCV library status:
--     version: 3.4.3
--     libraries: 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
--     include path: /usr/local/include;/usr/local/include/opencv
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yang/桌面/learningOPencv/編譯opencv_cpp檔案的方法2CMake/opencv_sourceCode

Step4: make

$ make
/usr/bin/cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[100%] Built target opencv_example
/usr/bin/cmake: /home/yang/anaconda2/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)

執行可執行檔案:

$ ./opencv_example
./opencv_example: /home/yang/anaconda2/lib/libtiff.so.5: no version information available (required by /usr/local/lib/libopencv_imgcodecs.so.3.4)
please input the image file path:
dog.jpeg

3.使用IDE:Qt Creator新建工程來使用opencv庫

1.新建一個Qt Console Application工程:hello_opencv

2.關鍵在工程的.pro檔案中加入下面的語句:配置opencv的include路徑和lib庫打路徑:

INCLUDEPATH+=/home/yang/opencv-3.4.3/include\
            /home/yang/opencv-3.4.3/include\opencv\
            /home/yang/opencv-3.4.3/include\opencv2
LIBS+=-L/home/yang/opencv-3.4.3/build/lib\
        -lopencv_core\
        -lopencv_imgcodecs\
        -lopencv_highgui\
        -lopencv_imgproc

整個.pro檔案和mian.cpp檔案如下:

QT += core
QT -= gui

CONFIG += c++11

TARGET = hello_opencv
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

    INCLUDEPATH+=/home/yang/opencv-3.4.3/include\
                /home/yang/opencv-3.4.3/include\opencv\
                /home/yang/opencv-3.4.3/include\opencv2
    LIBS+=-L/home/yang/opencv-3.4.3/build/lib\
            -lopencv_core\
            -lopencv_imgcodecs\
            -lopencv_highgui\
            -lopencv_imgproc

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

mian.cpp檔案如下:

#include <QCoreApplication>
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
//#include"imgproc.hpp"

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cout<<"please input a image file path:"<<endl;
    string imagePath;
    cin>>imagePath;
    String filePath=imagePath;
    cout<<"The input is "<<filePath<<endl;

    // /home/yang/Desktop/LearningOpenCV/opencv_CPP_hello/shot1.png
    Mat img=imread(filePath);
    if(img.empty())
    {
        cout<<"image is empty!"<<endl;
    }
    namedWindow("image");
    imshow("image",img);
    cv::waitKey(0);

    return 0;
}

3.直接編譯執行該工程:

please input a image file path:
/home/yang/Desktop/dog.jpeg
The input is /home/yang/Desktop/dog.jpeg
Press <RETURN> to close this window...

4.瞭解

1.想了解Liunx下c++的一些常用開發工具

2.任務驅動,但現在暫時沒找到Linux下開發所需要學習的方向

3.在計算機視覺學習方面,實驗室現在的開發與學習環境是 這樣打:

3.1Windows下做客戶端Qt+Opencv+附加的神經網路模型(使用Caffe深度學習框架訓練出來用於目標檢測的)

3.2Linux下使用 Caffe+CUDA+cuDNN在訓練神經網路模型(需要帶顯示卡的伺服器),普通PC帶nvidia顯示卡打做學習和寫程式碼

3.3在一些嵌入式領域:

3.3.1影象處理嵌入式:FPGA做板卡,完成一些諸如影象壓縮/解壓縮的任務。

3.3.2北京的一些做安防監控與自動駕駛的公司 :將剪枝壓縮的神經網路模型以C的開發方式在Xilinx的FGPA板卡上實現,用於車輛識別與檢測。

王建輝,深瞐科技CTO,華中科技大學博士,多年來從事FPGA晶片設計和機器學習方向的研究,專注於神經網路加速晶片設計和演算法優化,是該領域集硬體設計、演算法研發、整體優化能力於一體的全面性專家。

王建輝博士在此前接受億歐專訪時曾表示:“手機成為AI晶片的新引擎,安防市場終將面臨價格戰。”總結AI晶片如此火熱的根源,王建輝認為有四大因素:

第一,國家政策在扶持。2017年7月,國務院釋出了《新一代人工智慧發展規劃》,對人工智慧產業的發展做出詳細的規劃和明確的政策支援。規劃中表明,人工智慧產業要達到發展規劃中的產業規模,政府給予資源配置以及保障措施等政策幫助。去年以來,一級市場對人工智慧的景氣度高,從晶片、技術平臺的基礎層到語音識別、計算機視覺的應用層的融資現象都非常火熱。

第二,深度學習是一個非常新的技術,底層計算結構比較簡單,國內AI晶片公司跟國外的巨頭處於同一起跑線,也成為AI紅利的收益者。

第三,融資需求。公司做到一定程度之後,需要新的增長點來“講故事”,其實做晶片非常費錢,而且需要時間,晶片行業如果能做起來也是非常有潛力領域,想象空間大,更容易拿到錢。

第四,手機端對晶片的巨大需求,蘋果、小米、華為等廠商紛紛釋出AI手機,而手機一年的出貨量比安防市場攝像頭歷年存量還要大。

“安防對影象處理是剛需。未來3-5年中國所有的攝像頭會換一遍,海康、大華也這麼想。安防行業現在還處於相對渾濁的時期,但成熟之後就是拼價格。”王建輝說。

3.3.3 NVIDIA Jetson 是業內領先的 AI 計算平臺,它面向移動嵌入式系統市場中的 GPU 加速並行處理。在深度學習和計算機視覺方面的高效能、低能耗計算,使得 Jetson 成為計算密集型嵌入式專案的理想平臺。

nvidia的GPU+ARM的CPU,可以安裝Linux作業系統,就是一臺嵌入式的小型電腦,可以實現一些視覺,深度學習,的開發任務。

相關推薦

Linux Ubuntu 編譯Opencv c++專案方法

Table of Contents 4.瞭解 1.使用g++命令列 pkg-config引數方法 新建一個cpp檔案:main.cpp,功能是輸入一幅影象檔案的路徑並顯示該影象: #include<opencv2/opencv.hpp>

windows使用IDA遠端除錯linux(ubuntu)編譯的程式

1.背景 真機:win7 x64 ida pro 6.8 虛擬機器:ubuntu 16.04 x64 現在在win7下遠端除錯ubuntu內自己編譯的程式。 2.ubuntu內編譯程式 1.桌面建立test資料夾,並建立hello.c檔案 寫入程式

Linux執行緒同步的方法

Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數和訊號量。一、互斥鎖(mutex)   鎖機制是同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。 1. 初始化鎖   int pthread_mutex_init(pthread_mutex_t *m

linux新增庫檔案的方法

1. linux下系統會自動搜尋根目錄下的 /lib 以及 /usr/lib 下 只要將要新增的庫檔案用管理員許可權複製到該目錄下即可 2. 將連結庫庫放在/usr/lib下新建的資料夾中,

CSS實現拉菜單的方法

ansi display ora ble 下拉 技術 body round too PS:轉自https://www.cnblogs.com/yewenxiang/p/6064117.html 第一種:display:none和display:block切換 1 &l

Ubuntu 遠端桌面連線Window的方法

                   Window遠端桌面連線Ubuntu 的幾種方法   Window遠端連線Ubuntu有如下幾種方案。   一、TeamVie

jsp頁面跳轉的方法小結

1. RequestDispatcher.forward()   在伺服器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從當前的Servlet或者是JSP到另外的一個Servlet、JSP 或普通HTML檔案,也即你的form提交至a.js

Linux檢視分割槽檔案系統型別的方法

​  在Linux 中如何檢視分割槽的檔案系統型別,下面總結幾種檢視分割槽檔案系統型別的方法。 1、df -T 命令檢視   這個是最簡單的命令,檔案系統型別在Type列輸出。只可以檢視已經掛載的分割槽和檔案系統型別。如下所示: 2、parted -l命令檢視   如下所示

linux ssh 不用密碼自動登入的方法

2. 控制n個機器如上所述自動登入 那就需要n對鑰匙(金鑰和公鑰), ssh-keygen 命令可以隨意更改鑰匙對的名字, 比如: # ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save

Jetty和Tomcat執行Maven Web專案方法

目錄    1.採用Jetty執行Maven Web專案    2.採用Tomcat執行Maven Web專案  1、採用Jetty和Tomcat執行Maven Web專案   1)採用J

linux執行緒間同步(通訊)的方法——互斥鎖、條件變數、訊號量、讀寫鎖

Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導圖:  一、互斥鎖(mutex)    鎖機制是同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。 1 . 初始化鎖 int pthread_mutex_init(p

linux安裝軟體和解除安裝的方法

一、rpm包安裝方式步驟:  1、找到相應的軟體包,比如soft.version.rpm,下載到本機某個目錄;  2、開啟一個終端,su -成root使用者;  3、cd soft.version.rpm所在的目錄;  4、輸入rpm -ivh soft.version.

Linux作業系統配置環境變數的三方法

如果你的計算機僅僅作為開發使用時推薦使用這種方法,因為所有使用者的shell都有權使用這些環境變數,可能會給系統帶來安全性問題。 (1)用文字編輯器開啟/etc/profile (2)在profile檔案末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05 PATH=$

監控Linux環境JVM應用記憶體的兩方法

效能測試監控中,監控Linux環境下應用記憶體方法如下: ------------------------------------------------------------------------------------------------------------

jsp頁面跳轉的方法

1. RequestDispatcher.forward()  在伺服器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從當前的Servlet或者是JSP到另外的一個Servlet、JSP 或普通HTML檔案,也即你的form提交至a.jsp,在a.jsp用到了forward

ubuntulinux安裝openCV(ffmpeg導致的編譯不通過的解決辦法)

    1.opencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1313:21: error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope &nb

Linux 編譯Xerces-c++

linu ida 共享 ++ blank 這樣的 gunzip pad -c 原文地址: http://blog.csdn.net/chenlanmin/article/details/2200064 按照 doc/html 文件夾中的詳細指導編譯 Xerces-C++ 共

linux環境編譯運行OpenCV程序的兩方法

https 鏈接庫 pen vco ons 程序 TP uil htm 一、命令行Command Line 1 g++ opencv_test.cpp -o opencv_test `pkg-config --cflags --libs opencv` 2 ./op

知識積累--linux--安裝nodejs--執行window編譯過的專案

前景提要:       在本地windows環境下,做了一個專案,需要使用nodeJs環境,於是乎本地安裝了下nodeJs也配置了環境變數,專案執行著也沒有問題,現要將專案部署到linux的線上環境,在安裝nodeJS和執行npm run build,npm run

sublime在linux系統編譯C++的sublime.build檔案

{     "shell_cmd": "g++ -std=c++11 \"${file}\" -o \"${file_path}/${file_base_name}\"",     "file_rege