OpenCV: Linux下编译GPU版本(4.2.0版本)

从LZ开始接触CV也有几个年头了,OpenCV的版本也在不停的更新迭代,新版本的OpenCV较之前版本多了很多特性,也为了兼容现在大火的深度学习,会增加很多深度学习框架的支持,除此之外也增加了很多支持GPU操作的API,所以写这个博客的目的不是为了记录怎么编译OpenCV,而是记录下怎么编译GPU版本的OpenCV。
Required Packages

GCC 4.4.x or later
CMake 2.8.7 or higher
Git
GTK+2.x or higher, including headers (libgtk2.0-dev)
pkg-config
Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)
ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev
[optional] libtbb2 libtbb-dev
[optional] libdc1394 2.x
[optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
[optional] CUDA Toolkit 6.5 or higher
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

下载源码:

cd ~/<my_working_directory>
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

常规操作:

cd ~/opencv
mkdir build
cd build

cmake的编译配置

cmake  \
 -D CMAKE_BUILD_TYPE=RELEASE   \
 -D CMAKE_INSTALL_PREFIX=/usr/local  \
 -D WITH_TBB=ON   \ 这是intel的加速库
 -D WITH_V4L=ON  \
 -D WITH_QT=ON  \   #QT看个人需要
 -D WITH_OPENGL=ON  \
 -D WITH_CUDA=ON   \  #这个比较重要!
 -D ENABLE_FAST_MATH=1   \
 -D CUDA_FAST_MATH=1   
 -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES"   \
 -D WITH_CUBLAS=1 \
 -D OPENCV_EXTRA_MODULES_PATH=<your path to opencv_contrib>/opencv_contrib/modules\ #填写你的modules的路径
  ..



cmake后要仔细看下是否有对应cuda的一些配置结果,这个其实很少有小伙伴关注,基本操作就直接cmake后直接make,但实际上cmake打印出来的信息很重要,尤其注意,尽量编译的时候不要链接到Anaconda上的库,不然后续可能会哭。。。
在这里插入图片描述最后配置无误会出现:
在这里插入图片描述进行编译,看下自己的电脑是几核几线程,LZ的小笔记本是四个八线程,所以开八线程进行编译

make -j8

可以用top命令看下CPU的liyonglv,八个线程基本上把CPU都占满了,还可以看下COMMAND那一列,可以看到有cicc,cc1plus,ptxas三种,分别对应的是icc,这个指令基本上是用来编译intel ipp当中的加速库的,cc1plus这个应该很好理解c++指令,ptx基本上就是编译cuda代码了。
在这里插入图片描述
用sudo权限进行install

sudo make install

测试代码:

using namespace std;

#include "opencv2/opencv.hpp"

#include "opencv2/core/cuda.hpp"

using namespace cv;

int main() {
    int num_devices = cv::cuda::getCudaEnabledDeviceCount();

    if (num_devices <= 0) {
        std::cerr << "There is no device." << std::endl;
        return -1;
    }
    int enable_device_id = -1;
    for (int i = 0; i < num_devices; i++) {
        cv::cuda::DeviceInfo dev_info(i);
        if (dev_info.isCompatible()) {
            enable_device_id = i;
        }
    }
    if (enable_device_id < 0) {
        std::cerr << "GPU module isn't built for GPU" << std::endl;
        return -1;
    }
    cv::cuda::setDevice(enable_device_id);

    std::cout << "GPU is ready, device ID is " << num_devices << "\n";

    return 0;
}

最后输出结果:
在这里插入图片描述

遇到的问题:

1. /opencv-4.2.0/opencv_contrib/modules/viz/src/precomp.hpp:56:30: fatal error: vtkVersionMacros.h: No such file or directory
compilation terminated.

修改对应的文件

扫描二维码关注公众号,回复: 9153406 查看本文章
//#include <vtkVersionMacros.h>
#include <vtkVersion.h>

2.关于与Anaconda冲突的各种问题

在cmake的时候要检查有没有链接到Anaconda的一些库,在后期使用的时候会出现各种版本冲突的问题,或者 no version information available (required by … )
这个问题LZ纠结了很久,最后通过ldd发现,本地库与Anaconda里版本库冲突了,最后直接把Anaconda的库从PATH中禁掉了
在这里插入图片描述这里千万不要像某些方法,直接把原有的库删除,不然后期会有一连串cannot find类型的错误,或者随意修改软链接,这个回事要针对自己的问题好好分析一下的。

3.一直卡在97%

[ 97%] Built target opencv_perf_stitching

这个可以查看下top,发现cpu的占用率为100%左右,即有一个线程一直在工作,并且command指令一直在改变,说明确实在编译,只是真的很慢!所以BE PATIENT!

参考地址:
https://docs.opencv.org/4.2.0/d7/d9f/tutorial_linux_install.html
https://blog.csdn.net/cocoaqin/article/details/78376382

发布了300 篇原创文章 · 获赞 203 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/Felaim/article/details/103971397