Home Ubuntu 16.04编译配置opencv 4.1.1 + opencv_contrib 4.1.1(C++ & Python)
Post
Cancel

Ubuntu 16.04编译配置opencv 4.1.1 + opencv_contrib 4.1.1(C++ & Python)

0 引言

主要参考资料: 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-python环境 OpenCV官网也上不去,加载半天没反应,百度各种配置过程教程,结果总是卡在编译make过程,看make报错信息,大概知道是由Anaconda环境导致的错误,里面有一小节报错信息是这样:

1
/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)的存在冲突?从而就有如下两个方案:

  1. .bashrc中anaconda坏境变量注释,重新source .bashrc,试了不行,仍然报错;
  2. 直接conda deactivate退出当前anaconda环境(默认的应该是base),然后竟然编译安装成功了。(打码的地方是用户名)

退出anaconda环境

1 编译安装过程

1.1 安装依赖库

这一部分,完全按着参考博客【Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source】中的Step 1来进行的,照着安装即可,毕竟很多东西其实我也不知道是什么。

由于我一直使用的是Anaconda的python环境,所以参考博客中Step 2 到 Step5,我都没有用到。

1.2 下载OpenCV及OpenCV_Contrib源码

我下载的是OpenCV 4.1.1OpenCV Contrib 4.1.1的源码(版本号一致),下载完成之后将其解压

1
2
wget https://github.com/opencv/opencv/archive/4.1.1.zip
wget https://github.com/opencv/opencv_contrib/archive/4.1.1.zip

在这里插入图片描述

1.3 构建、编译OpenCV

1
2
3
4
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介绍,我使用的构建参数如下:

1
2
3
4
5
6
7
8
9
10
11
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查询出的值。

1
2
nproc
make -j20    # 根据个人机器修改

然后就是等,如果运气好的话,就100%编译成功了,如果遇上什么奇奇怪怪的问题,那就再去查吧。我的机器到这是成功编译了的,我觉得我编译成功的关键就是那句conda deactivate

1.4 安装以及环境配置

编译成功之后,进行安装,需要root权限:

1
sudo make install

安装完之后,其路径位于/usr/local/opencv-4.1.1,需要添加动态库路径,相当于告诉系统下次编译C++代码时,动态链接库到哪里去找。

1
2
sudo sh -c 'echo "/usr/local/opencv-4.1.1/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

1.5 opencv4.pc文件的修改与重定位

构建的时候说过-D OPENCV_GENERATE_PKGCONFIG=YES用于生成opencv4.pc文件,方便今后编译代码使用。

我们可以在路径/usr/local/opencv-4.1.1/lib/pkgconfig/下找到该文件,将其复制到/usr/local/pkgconfig/路径下,如果不存在就创建这个目录:

1
2
3
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介绍,我没有测试不改行不行,反正改了是可行的。

1
2
cd /usr/local/lib/pkgconfig
sudo vi opencv4.pc

1
includedir_old=${prefix}/include/opencv4/opencv

改为

1
includedir_old=${prefix}/include/opencv4/opencv2

这一些工作完成后,我们就可以进行测试了

2 测试

命令行输入:

1
pkg-config --libs --cflags opencv4

输出

1
-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的操作)

2.1 C++代码的测试

新建文件OpenCV_Demo.cpp

1
2
3
4
5
6
7
8
9
10
11
12
#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;
}

编译:

1
g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv4` -o main

运行:

1
./main

C++示例

2.2 Python代码测试

事实上,我这安装的只会对C++环境有影响,Python环境下的OpenCV仍然是我之前通过anaconda安装的opencv-python,但是编译OpenCV源码过程中也会生成可供Python使用的动态链接库,我们可以将Anaconda里面的opencv-python动态链接库文件替换为新生成的动态链接库文件。

Anaconda中opencv-python安装位置如下,里面包含动态库文件cv2.cpython-37m-x86_64-linux-gnu.so

1
YOUR_ANACONDA_PATH/anaconda3/lib/python3.7/site-packages/cv2

我们编译OpenCV源码新生成的动态链接库文件位置如下,里面包含动态链接库文件python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so:

1
/usr/local/opencv-4.1.1/lib/python3.5/dist-packages/cv2

如果需要使用我们编译的动态链接库作为python版本的opencv,可以替换掉Anaconda里的动态链接库(不建议直接替换,最好留个备份,因为我也不知道会不会有什么隐患,我看了下我编译生成的动态库文件只有7M多,但是Anaconda下载的有27M,不清楚会不会有什么问题):

1
2
3
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虚拟环境再次激活:

1
conda activate base

可以看到opencv的版本从本来的4.2.0变成了编译的4.1.1。 在这里插入图片描述

This post is licensed under CC BY 4.0 by the author.

-

MacOS下iterm,Dracula主题配置