从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!
参考地址:
https://docs.opencv.org/4.2.0/d7/d9f/tutorial_linux_install.html
https://blog.csdn.net/cocoaqin/article/details/78376382