主要参考资料: Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source
Ubuntu 16.04上安装了Anaconda 3(python 3.7.4)的环境,装有opencv-python (4.2.0)包,发现一直没有配置OpenCV(C++)环境。目的也就是编译安装OpenCV(C++)环境,为了测试ViBe官方开源C代码在Ubuntu上的效率,从而试图找出【利用Cython打包复用ViBe运动目标检测C源码】一开始python调用速度不是很快的原因。
OpenCV官网也上不去,加载半天没反应,百度各种配置过程教程,结果总是卡在编译make
过程,看make
报错信息,大概知道是由Anaconda环境导致的错误,里面有一小节报错信息是这样:
/usr/bin/ld: warning: libzstd.so.1.3.7, needed by //home/***/anaconda3/lib/libtiff.so.5, not found (try using -rpath or -rpath-link)
猜测Anaconda的libtiff.so.5
和系统本身下载(见参考的博客的Step 1: Installing dependencies of OpenCV,预先下载依赖项中包含libtiff
)的存在冲突?从而就有如下两个方案:
.bashrc
中anaconda坏境变量注释,重新source .bashrc
,试了不行,仍然报错;conda deactivate
退出当前anaconda环境(默认的应该是base
),然后竟然编译安装成功了。(打码的地方是用户名)这一部分,完全按着参考博客【Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source】中的Step 1来进行的,照着安装即可,毕竟很多东西其实我也不知道是什么。
由于我一直使用的是Anaconda的python环境,所以参考博客中Step 2 到 Step5,我都没有用到。
我下载的是OpenCV 4.1.1和OpenCV Contrib 4.1.1的源码(版本号一致),下载完成之后将其解压
wget https://github.com/opencv/opencv/archive/4.1.1.zip
wget https://github.com/opencv/opencv_contrib/archive/4.1.1.zip
conda deactivate # 我编译成功的关键,退出当前anaconda虚拟环境
cd opencv-4.1.1
mkdir build
cd build
构建过程应该算是核心操作了吧,具体参数的意义参考【Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source】中Step 7介绍,我使用的构建参数如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.1.1 \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D WITH_TBB=OFF \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=OFF \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.1/modules \
-D BUILD_EXAMPLES=ON \
-D OPENCV_GENERATE_PKGCONFIG=YES .. # 注意最后的两个点儿
其中-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.1.1
用于指定编译安装位置,不指定的话默认应该是装在/use/local
;-D INSTALL_C_EXAMPLES=ON
和-D INSTALL_PYTHON_EXAMPLES=ON
应该是可要可不要,接下来的四个-D WITH_***
看个人需要ON
或者OFF
吧;-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.1/modules
指定OpenCV Contrib的路径,如果不需要删掉这一行就行,也不用下载它的源码;-D OPENCV_GENERATE_PKGCONFIG=YES
用于生成opencv4.pc
文件,方便今后编译代码使用。
编译过程,可以先使用nproc
命令查找可以并行运行的线程数,然后使用make -jn
来进行编译,n最好小于nproc
查询出的值。
nproc
make -j20 # 根据个人机器修改
然后就是等,如果运气好的话,就100%编译成功了,如果遇上什么奇奇怪怪的问题,那就再去查吧。我的机器到这是成功编译了的,我觉得我编译成功的关键就是那句conda deactivate
。
编译成功之后,进行安装,需要root权限:
sudo make install
安装完之后,其路径位于/usr/local/opencv-4.1.1
,需要添加动态库路径,相当于告诉系统下次编译C++代码时,动态链接库到哪里去找。
sudo sh -c 'echo "/usr/local/opencv-4.1.1/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
opencv4.pc
文件的修改与重定位构建的时候说过-D OPENCV_GENERATE_PKGCONFIG=YES
用于生成opencv4.pc
文件,方便今后编译代码使用。
我们可以在路径/usr/local/opencv-4.1.1/lib/pkgconfig/
下找到该文件,将其复制到/usr/local/pkgconfig/
路径下,如果不存在就创建这个目录:
cd /usr/local/lib
mkdir pkgconfig
sudo cp /usr/local/opencv-4.1.1/lib/pkgconfig/opencv4.pc /usr/local/lib/pkgconfig/
然后对该文件进行修改,修改参考的【Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source】中Step 9介绍,我没有测试不改行不行,反正改了是可行的。
cd /usr/local/lib/pkgconfig
sudo vi opencv4.pc
将
includedir_old=${prefix}/include/opencv4/opencv
改为
includedir_old=${prefix}/include/opencv4/opencv2
这一些工作完成后,我们就可以进行测试了
命令行输入:
pkg-config --libs --cflags opencv4
输出
-I/usr/local/opencv-4.1.1/include/opencv4/opencv2 -I/usr/local/opencv-4.1.1/include/opencv4 -L/usr/local/opencv-4.1.1/lib -lopencv_stitching -lopencv_gapi -lopencv_freetype -lopencv_img_hash -lopencv_bioinspired -lopencv_stereo -lopencv_tracking -lopencv_face -lopencv_xobjdetect -lopencv_rgbd -lopencv_fuzzy -lopencv_xphoto -lopencv_dnn_objdetect -lopencv_surface_matching -lopencv_sfm -lopencv_saliency -lopencv_plot -lopencv_structured_light -lopencv_xfeatures2d -lopencv_shape -lopencv_phase_unwrapping -lopencv_videostab -lopencv_photo -lopencv_reg -lopencv_hdf -lopencv_hfs -lopencv_aruco -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_bgsegm -lopencv_ccalib -lopencv_line_descriptor -lopencv_dpm -lopencv_objdetect -lopencv_highgui -lopencv_quality -lopencv_ml -lopencv_superres -lopencv_optflow -lopencv_ximgproc -lopencv_video -lopencv_calib3d -lopencv_videoio -lopencv_imgcodecs -lopencv_features2d -lopencv_imgproc -lopencv_flann -lopencv_core
输出来自上面opencv4.pc
文件中的内容,实际上也就是指定了编译OpenCV的C++代码时,编译器需要的与OpenCV相关的库文件。即起到了gcc / g++
编译时,-I
、-L
和-l
的作用。(相当于【Code::Blocks16.01配置MinGW64及opencv4.1.1】时在Code::Blocks中配置OpenCV的操作)
新建文件OpenCV_Demo.cpp
:
#include "opencv.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
cout << "OpenCV version : " << CV_VERSION << endl;
cout << "Major version : " << CV_MAJOR_VERSION << endl;
cout << "Minor version : " << CV_MINOR_VERSION << endl;
cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
}
编译:
g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv4` -o main
运行:
./main
事实上,我这安装的只会对C++环境有影响,Python环境下的OpenCV仍然是我之前通过anaconda安装的opencv-python,但是编译OpenCV源码过程中也会生成可供Python使用的动态链接库,我们可以将Anaconda里面的opencv-python动态链接库文件替换为新生成的动态链接库文件。
Anaconda中opencv-python安装位置如下,里面包含动态库文件cv2.cpython-37m-x86_64-linux-gnu.so
:
YOUR_ANACONDA_PATH/anaconda3/lib/python3.7/site-packages/cv2
我们编译OpenCV源码新生成的动态链接库文件位置如下,里面包含动态链接库文件python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so
:
/usr/local/opencv-4.1.1/lib/python3.5/dist-packages/cv2
如果需要使用我们编译的动态链接库作为python版本的opencv,可以替换掉Anaconda里的动态链接库(不建议直接替换,最好留个备份,因为我也不知道会不会有什么隐患,我看了下我编译生成的动态库文件只有7M多,但是Anaconda下载的有27M,不清楚会不会有什么问题
):
cd YOUR_ANACONDA_PATH/anaconda3/lib/python3.7/site-packages/cv2
mv cv2.cpython-37m-x86_64-linux-gnu.so old_cv2.cpython-37m-x86_64-linux-gnu.so
cp /usr/local/opencv-4.1.1/lib/python3.5/dist-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so ./cv2.cpython-37m-x86_64-linux-gnu.so
然后就可以测试了,测试之前需要将我们的Anaconda虚拟环境再次激活:
conda activate base