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

从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.

修改对应的文件

//#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!

安装OpenCV 4.2版本(2020.4.22)

安装OpenCV4.2版本,安装对应依赖项

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
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 4.2.0
cd ../opencv
git checkout 4.2.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -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=../opencv_contrib/modules/ -D CUDA_ARCH_BIN=5.3,6.0,6.1,7.0,7.5 -DCUDA_ARCH_PTX=7.5 -DOPENCV_ENABLE_NONFREE=ON -D BUILD_EXAMPLES=OFF  -D BUILD_opencv_world=ON -D OPENCV_GENERATE_PKGCONFIG=ON ..
make -j4
make install

CMake Error at modules/dnn/CMakeLists.txt:99 (message):
  CUDA backend for DNN module requires CC 5.3 or higher.  Please remove
  unsupported architectures from CUDA_ARCH_BIN option.
Call Stack (most recent call first):
  modules/world/CMakeLists.txt:13 (include)
  modules/world/CMakeLists.txt:32 (include_one_module)
cmake时添加下列设置
-D CUDA_ARCH_BIN=5.3,6.0,6.1,7.0,7.5 -DCUDA_ARCH_PTX=7.5
~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: fatal error: boostdesc_bgm.i: No such file or directory

解决方式:

采用的是源码编译的方式,所以可以查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索 boostdesc_bgm.i 关键词 (不是在文件夹中搜索),
发现这个文件下载失败了。日志文件里就有它的下载地址,直接复制其下载地址到网页可以看该到文件的源码,直接拷贝源码并生存同名文件,放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可。

总共缺了以下几个文件,都需要拷贝:

boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
/home/software/opencv_4.2.0/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp:51:62: fatal error: features2d/test/test_detectors_regression.impl.hpp: No such file or directory
compilation terminated.
modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/build.make:75: recipe for target 'modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/__/__/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp.o' failed
make[2]: *** [modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/__/__/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....

解决办法

step.1 进入opencv源码目录~/opencv/modules/features2d/test/,拷贝test_detectors_regression.impl.hpp 及 test_descriptors_regression.impl.hpp 到 ~/opencv_contrib/modules/xfeatures2d/test/下
step.2 编辑 test_features2d.cpp ,修改include文件地址

// #include "features2d/test/test_detectors_regression.impl.hpp"
// #include "features2d/test/test_descriptors_regression.impl.hpp"
// 修改文件地址如下
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"

/home/software/opencv_4.2.0/opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp:7:82: fatal error: features2d/test/test_detectors_invariance.impl.hpp: No such file or directory
compilation terminated.
modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/build.make:140: recipe for target 'modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/__/__/opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp.o' failed
make[2]: *** [modules/world/CMakeFiles/opencv_test_xfeatures2d.dir/__/__/opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....

继续按上面方法,根据提示的缺少文件从./opencv/modules/features2d/test中拷贝如下文件到./opencv_contrib/modules/xfeatures2d/test/

test_detectors_invariance.impl.hpp
test_descriptors_invariance.impl.hpp
test_invariance_utils.hpp
然后修改test_rotation_and_scale_invariance.cpp文件

// #include "features2d/test/test_detectors_invariance.impl.hpp" // main OpenCV repo
// #include "features2d/test/test_descriptors_invariance.impl.hpp" // main OpenCV repo
#include "test_detectors_invariance.impl.hpp" // main OpenCV repo
#include "test_descriptors_invariance.impl.hpp" // main OpenCV repo
make error with opencv-4.2.0: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
解决办法:
-D BUILD_EXAMPLES=OFF

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

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux编译OpenCV GPU版本,您需要遵循以下步骤: 1. 安装CUDA 首先,您需要安装CUDA(Compute Unified Device Architecture)工具包。您可以从NVIDIA官网下载适合您操作系统的CUDA版本,然后按照官方文档的说明进行安装。 2. 安装OpenCV 安装OpenCV的方法因操作系统而异。在Ubuntu上,您可以使用以下命令安装OpenCV: ``` sudo apt-get install libopencv-dev ``` 如果您使用的是其他Linux发行版,可以参考OpenCV官方文档中的说明进行安装。 3. 编译OpenCV with GPU支持 为了启用OpenCVGPU支持,您需要将WITH_CUDA选项设置为ON。在编译过程中,您还需要指定CUDA安装路径,以及用于GPU计算的架构和代码生成选项。以下是一个示例CMake命令: ``` cmake -D WITH_CUDA=ON \ -D CUDA_ARCH_BIN="<arch>" \ -D CUDA_ARCH_PTX="<arch>" \ -D CUDA_GENERATION="<code_gen>" \ -D CUDA_TOOLKIT_ROOT_DIR="<cuda_install_path>" \ <opencv_source_path> ``` 其中,`<arch>`表示您要支持的GPU架构,例如`sm_50`;`<code_gen>`表示用于生成GPU代码的CUDA版本,例如7.0;`<cuda_install_path>`是CUDA的安装路径,在Ubuntu上通常是`/usr/local/cuda`;`<opencv_source_path>`是OpenCV源代码的路径。 4. 编译和安装OpenCV 完成上述设置后,运行以下命令编译和安装OpenCV: ``` make -j8 sudo make install ``` 在编译和安装过程中,您可以根据需要调整并行编译的线程数(`-j`选项)。 完成上述步骤后,您就可以在OpenCV中使用GPU加速了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值