目前手上有一个工作,需要在Ubuntu 16.04 上自行编译OpenCV 2.4,并且还要用CUDA 9。尝试了一下午,终于能够编译通了,这里记录一下。
下载源码
在OpenCV 3.0.0之前的版本,与opencv_contrib对应的包为opencv_extra,体积还是非常大的,注意提前下载好。
配置CUDA
由于OpenCV 2.4 对CUDA 9不直接支持,所以需要对CMake的指令和OpenCV源码本身做一些修正。
对CMake的修正主要参考下术博客,从这个博客又可以链接到另外两个页面。
https://davidstutz.de/compiling-opencv-2-4-x-with-cuda-9/
https://github.com/davidstutz/opencv-2.4-cuda-9-patch/blob/master/cmake/OpenCVDetectCUDA.cmake
https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound
值得注意的是,我并没有覆盖OpenCVDetectCUDA.cmake文件。
即使通过上述配置过程,opencv_extra中,仍然有两个包没有通过配置,但是这两个都是sample包,我就直接把它们删除了。它们是gpu_demos_pack和learning_opencv_v2。
解决nppiGraphcut
编译OpenCV过程中,出现了找不到NppiGraphcutState一类的错误,经过google查询,也是由于CUDA版本造成的不兼容,参考这里进行了修正
https://rohanrajblogs.blogspot.com/2016/12/installation-of-opencv-2411-along-with.html
http://answers.opencv.org/question/95148/cudalegacy-not-compile-nppigraphcut-missing/
修正pkg-config文件
经过上述修正,OpenCV 2.4.11可以正常编译了。但经过install后,得到的pkg-config文件内有对library错误的描述。假设我们使用默认安装位置/usr/local,那么在文件/usr/local/lib/pkgconfig/opencv.pc中,将
Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lcufft -lnpps -lnppitc -lnppisu -lnppist -lnppim -lnppig -lnppif -lnppidei -lnppicom -lnppicc -lnppial -lnppc -lcudart -lrt -lpthread -lm -ldl
中-lcufft -lnpps -lnppitc -lnppisu -lnppist -lnppim -lnppig -lnppif -lnppidei -lnppicom -lnppicc -lnppial -lnppc -lcudart全部删除。
使用CMake配置使用OpenCV的项目时是否需要对/usr/local/share/OpenCV内的文件修正,目前还未测试。