1. 程式人生 > >ubuntu16.04下opencv3.2和opencv_contrib編譯安裝

ubuntu16.04下opencv3.2和opencv_contrib編譯安裝

網上存在很多編譯安裝教程,但是為了讓整篇文章整體化,把編譯安裝opencv3.2的過程還是需要在這裡在贅述一遍,方便和我一樣新入手opencv的小白們只看一篇文章,一次編譯成功。

建議:如果是已經編譯過opencv3.2後來想在其中加入opencv_contrib的朋友,可能會出現一個bug(後面會提到),而且是在你make完成98%左右的時候出現,所以很傷,建議如果不是有必要的情況或者是專案太多不能刪除以前的opencv,建議刪除原來的opencv,重新將opencv和opencv_contrib同時安裝。

一、需要用到的資源(百度雲)

    opencv3.2:連結: https://pan.baidu.com/s/1jHRSsYU 密碼: dhym

    opencv_contrib:連結:https://pan.baidu.com/s/1eSrIOtc 密碼: naah

    opencn_i(後面可能會由於網路不好,導致編譯時下載不上一些檔案而出現的問題所用到的檔案):連結:http://download.csdn.net/detail/cupidyzw97/9892881

二、OpenCV和Opencv_contrib的編譯安裝

1、安裝依賴

在終端輸入以下三條命令,安裝所需要的依賴

1. sudo apt-get install build-essential

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

3. sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

2、cmake生成makefile

2.1、將下載好的OpenCV解壓到自己的目標目錄中,我提取到home目錄下,為了方便重新命名為opencv

2.2、如果要同時安裝opencv_contrib的話,你需要將opencv_contrib.zip提取到opencv目錄下,同時在該目錄下新建一個資料夾build

2.3、進入build目錄。並且執行cmake生成makefile檔案

第一步:
cd opencv-3.2.0/build

第二步:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv_contrib/modules/ ..

如果不安裝opencv_contrib模組,則第二步的命令為:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local

其中/usr/local/opencv320是指將要install的路徑,一般預設為/usr/local

其中OPENCV_EXTRA_MODULES_PATH=/home/jason/opencv_contrib-3.2.0/modules/ .. 是指opencv_contrib-3.2.0中modules所在的路徑,後面的兩點不可省略

此過程中可能遇到的問題:
(1)、由於網路原因,可能出現ippicv_linux_20151201.tgz(這個檔案在我上傳的opencv_i.zip壓縮包中已經給出)無法在終端下載的情況,則可以先單獨下載ippicv_linux_20151201.tgz之後,把其移動到終端所提示的路徑(終端會提示該路徑找不到檔案),如路徑/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/

移動的時候,可以另外開啟一個終端操作:
sudo mv ippicv_linux_20151201.tgz /opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e

(2)、可能在cmake過程中會出現以下三個同樣原因的問題(注:下載我上面的版本的opencv_contrib由於我已經修改好了,所以不會出現這個問題)

出現上述類似問題的解決方法是將顯示的錯誤資訊的對應檔案的對應位置中的FILENAME修改成PACKAGE即可。

3、make和install

在cmake成功之後,就可以在build檔案下make了。

第1步:
sudo make

第2步:
sudo make install

make時可能出現的問題:

(1)、會提示少一些檔案,目前發現這些檔案都是在opencv_contrib/modules/xfeatures2d/src資料夾下缺少的,是由於在cmake是沒有下載好。可能是因為伺服器不在國內的原因。(我上傳的opencv_contrib.zip壓縮包也已經把這些檔案新增進去了)。

只需要把相應的檔案複製到opencv/opencv_contrib/modules/xfeatures2d/src資料夾下即可。

(2)、如果是先安裝好的opencv3.2,然後在編譯新增opencv_contrib時會出現一個Bug。如下:

cuda.hpp這個檔案在相應的資料夾下尋找是肯定存在的,當初我出現這個問題的時候找了好多方法,都解決不了,最後還是刪了以前先安裝好的opencv然後重新把opencv和opencv_contrib同時編譯安裝,才沒有這個問題的。所以我才在最開始建議大家opencv和opencv_contrib同時編譯安裝。目前我並沒有找到有效的方法解決這個問題(我的問題是沒解決),所以只能把我找的方法給大家貼上來,大家自己嘗試以下,如果總是不成功,還是建議大家刪了以前的opencv,重新把opencv和opencv_contrib同時編譯安裝。

方法:http://code.opencv.org/issues/4140

至此我們的opencv和opencv_contrib就編譯安裝完成了。一定要記著sudo make install 否則會出現自己的程式在編譯時提示:error:為宣告的定義

下面給大家一個例程,可以驗證自己的opencv和opencv_contrib是否安裝成功。

三、一個KCF跟蹤的小例程

1、在自己想要的任何位置新建一個用於放例程資料夾:kcf_demo

2、新建一個簡單的main.cpp檔案

#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring> 

using namespace std;
using namespace cv;

int main() {  
    // declares all required variables  
    //! [vars]  
    Rect2d roi;  
    Mat frame;  
    //! [vars]  
  
    // create a tracker object  
    Ptr<Tracker> tracker = Tracker::create("KCF");  
    //! [create]  
  
    // set input video  
    //! [setvideo]  
    //std::string video = "/home/cuoid/kcfDemo/demo1/vtest.avi";  
    //VideoCapture cap(video);
    VideoCapture cap(1);
    //! [setvideo]  
  
    // get bounding box  
    //! [getframe]  
    cap >> frame;  
    //! [getframe]  
    //! [selectroi]選擇目標roi以GUI的形式
    if(!frame.empty()){
        roi=selectROI("tracker",frame);
    }  
    //! [selectroi]  
  
    //quit if ROI was not selected  
    if (roi.width == 0 || roi.height == 0)  
        return 0;  
  
    // initialize the tracker  
    //! [init]  
    tracker->init(frame, roi);  
    //! [init]  
  
    // perform the tracking process  
    printf("Start the tracking process\n");  
    for (;; ) {  
        // get frame from the video  
        cap >> frame;  
        // stop the program if no more images  
        if (frame.rows == 0 || frame.cols == 0)  
            break;  
  
        // update the tracking result  
        //! [update]  
        tracker->update(frame, roi);  
        //! [update]  
  
        //! [visualization]  
        // draw the tracked object  
        rectangle(frame, roi, Scalar(255, 0, 0), 2, 1);  
  
        // show image with the tracked object
        if(!frame.empty()){
            imshow("tracker",frame);
	}  
        //! [visualization]  
        //quit on ESC button  
        if (waitKey(1) == 27)  
            break;  
    }  
  
    return 0;  
}

這個例程是通過攝像頭獲取影象進行追蹤。

3、在和main.cpp同一資料夾下建立一個CMakeLists.txt檔案(CMake超級強大哦)

cmake_minimum_required(VERSION 3.0)
PROJECT(kfcDemo1)
SET(SRC_LIST main.cpp)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
ADD_EXECUTABLE(demo1 ${SRC_LIST})
target_link_libraries(demo1 ${OpenCV_LIBS})

find_package(OpenCV REQUIRED)是搜尋opencv的包。

include_directories(${OpenCV_INCLUDE_DIRS})是定義opencv的包含目錄所在的位置

target_link_libraries(demo1 ${OpenCV_LIBS})是連結opencv的庫

4、新建Build資料夾並且進行編譯

1、mkdir build

2、cd build

3、cmake ..

4、make

這樣我們就得到了一個小程式demo1,可以直接呼叫看看效果,這裡就不再放結果了。