从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