ubuntu 安装 opencv4

一、下载

  1. 下载 opencv 以及 contrib 库

git clone https://github.com/opencv/opencv.git

git clone https://github.com/opencv/opencv_contrib.git

  1. 安装依赖项

    sudo apt-get install build-essential

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

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

  2. 安装 cuda 和 cudnn

  3. 安装 cmake-gui

    sudo apt-get install cmake-qt-gui

二、cmake 编译安装 opencv

1. CMAKE

打开 cmake-gui

Where is the source code:填写 opencv 源代码目录

Where is build the binaries:在 opencv 源代码目录内新建一 build 文件(外部构建)

  • 点击 configure

    • 设置:

      CMAKE_BUILD_TYPE=Release

      OPENCV_ENABLE_NONFREE=ON

      OPENCV_GENERATE_PKGCONFIG=ON

    • 设置 contrib 库

      OPENCV_EXTRA_MODULES_PATH=/home/.../opencv_contrib/modules

      设置到 contrib 库源代码内的 modules 文件夹

    • 设置安装目录

      CMAKE_INSTALL_PREFIX=/usr/local/opencv4

      默认路径为 /usr/local

      为安装多版本 opencv 建议自定义一个目录

    • CUDA(选)

      勾选 cuda 选项

    • 点击 Generate

2. 编译安装

终端进入 build 目录

make -j4

-j4 为四个线程编译

sudo make install

如果安装了 python-dev,这时 Python 应该可以使用 OpenCV 了:

1
2
3
4
5
$ python 
>>> import cv2
>>> cv2.__version__
'4.0.1'
>>>

3. 配置 opencv

  • 让系统在 opencv 安装目录中搜索动态库

    1
    2
    3
    cd /etc/ld.so.conf.d/
    sudo touch opencv4.conf
    sudo sh -c 'echo "/usr/local/opencv4/lib" > opencv4.conf'

    == 注意:echo "/usr/local/opencv4/lib" 为 opencv 安装目录 ==

​ 更新 pkg-config:

sudo ldconfig

  • 设置 bash:

    sudo gedit /etc/bash.bashrc

    在末尾追加:

    1
    2
    PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv4/lib/pkgconfig  
    export PKG_CONFIG_PATH

    == 注意上面的路径为安装路径!!!==

    保存,执行如下命令使得配置生效:

    source /etc/bash.bashrc

    查看 opencv 版本:

    pkg-config --modversion opencv

opencv 安装完成!!

三、测试

  • opencv 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

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

    using namespace cv;
    using namespace cv::xfeatures2d; // 不要忘了导入扩展模块
    using namespace std;

    Mat src_img, gray_img;
    const string output_name = "SURF特征检测";
    int minHessian = 100; // 定义SURF中的hessian阈值特征点检测算子
    int max_value = 500;

    void SURF_detect_func(int, void *)
    {
    // SURF特征检测
    Ptr<SURF> detector = SURF::create(minHessian);
    vector<KeyPoint> keypoints;
    detector->detect(gray_img, keypoints, Mat()); // 检测src_img图像中的SURF特征
    // 绘制关键点
    Mat keypoint_img;
    dracmakelists:wKeypoints(gray_img, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); // Scalar::all(-1)这是一种技巧,就是当用一个负数作为关键点颜色,表示每次随机选取颜色。
    imshow(output_name, keypoint_img);
    }


    int main()
    {
    src_img = imread("1.png");
    if (src_img.empty())
    {
    printf("could not load the image...\n");
    return -1;
    }
    namedWindow("原图", WINDOW_AUTOSIZE);
    imshow("原图", src_img);
    cvtColor(src_img, gray_img, COLOR_BGR2GRAY);
    namedWindow(output_name, WINDOW_AUTOSIZE);
    createTrackbar("hessian阈值", output_name,&minHessian, max_value, SURF_detect_func);
    SURF_detect_func(0,0);

    waitKey(0);
    return 0;
    }

    CMakeLists.txt:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 声明要求的 cmake 最低版本
    cmake_minimum_required( VERSION 2.8 )

    # 声明一个 cmake 工程
    project( opencv_test )

    # 设置编译模式
    set( CMAKE_BUILD_TYPE "Debug" )
    set(CMAKE_CXX_FLAGS "-std=c++11")

    find_package(OpenCV 4.1 REQUIRED)

    # 添加一个可执行程序
    # 语法:add_executable( 程序名 源代码文件 )
    add_executable( test surf.cpp )

    # 将库文件链接到可执行程序上
    target_link_libraries( test ${OpenCV_LIBS} )
  • cuda 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/core/version.hpp>
    #include <opencv2/cudaarithm.hpp>

    int main (int argc, char* argv[])
    {
    try
    {
    /// 读取图片
    cv::Mat src_host = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);
    /// 定义GpuMat
    cv::cuda::GpuMat dst, src;
    /// 将主机内存的图像数据上传到GPU内存
    src.upload(src_host);

    /// 调用GPU的阈值函数(很多使用GPU加速的函数都和CPU版本的函数相同)
    cv::cuda::threshold(src, dst, 120, 255, cv::THRESH_BINARY);

    cv::Mat result_host;
    /// 从GPU上下载阈值化完成的图片
    dst.download(result_host);

    /// 显示
    cv::imshow("Result", result_host);
    cv::waitKey();
    }
    catch(const cv::Exception& ex)
    {
    std::cout << "Error: " << ex.what() << std::endl;
    }
    return 0;
    }

    CMakeLists.txt:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    cmake_minimum_required(VERSION 3.0)

    project(cuda_test)

    set(CUDA_USE_STATIC_CUDA_RUNTIME ON) #这一句解决 cannot find -lopencv_dep_cudart
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})

    find_package(CUDA REQUIRED)
    message(STATUS "CUDA版本: ${CUDA_VERSION}")
    message(STATUS " 头文件目录:${CUDA_INCLUDE_DIRS}")
    message(STATUS " 库文件列表:${CUDA_LIBRARIES}")
    set(CUDA_NVCC_FLAGS -G;-g;-std=c++11) # nvcc flags
    include_directories(${CUDA_INCLUDE_DIRS})


    set(OpenCV_DIR "/usr/local/share/OpenCV") # 指定OpenCV安装路径来区分不同的OpenCV版本
    find_package(OpenCV REQUIRED)
    set(OpenCV_LIB_DIR ${OpenCV_INSTALL_PATH}/lib)
    message(STATUS "OpenCV版本: ${OpenCV_VERSION}")
    message(STATUS " 头文件目录:${OpenCV_INCLUDE_DIRS}")
    message(STATUS " 库文件目录:${OpenCV_LIB_DIR}")
    message(STATUS " 库文件列表:${OpenCV_LIBS}")
    include_directories(${OpenCV_INCLUDE_DIRS})
    link_directories(${OpenCV_LIB_DIR})


    CUDA_ADD_EXECUTABLE(main main.cpp)
    target_link_libraries(main ${OpenCV_LIBS} ${CUDA_LIBRARIES})

参考文章

https://blog.csdn.net/sss_369/article/details/94755824