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,可以直接调用看看效果,这里就不再放结果了。

猜你喜欢

转载自blog.csdn.net/cupidyzw97/article/details/74857467