今天准备在自己的笔记本Ubuntu 20.04上搭建OpenCV的环境,记录流程如下。

1. 开始

1.1 安装依赖库

# 安装编译下载等工具
# build-essential用于下载gcc、g++等编译工具链
sudo apt-get install build-essential cmake git pkg-config wget unzip
# 安装依赖库,网上查到不少依赖库,不清楚具体作用,看到新的就下载
# opencv的highgui是基于gtk2.0的
sudo apt-get install  libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev libswscale-dev libavresample-dev
sudo apt-get install libtbb2 libtbb-dev
sudo apt-get install -y zlib1g-dev libwebp-dev libpng-dev libopenexr-dev libgdal-dev
sudo apt-get install -y libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev yasm libopencore-amrnb-dev libopencore-amrwb-dev libv4l-dev libxine2-dev
sudo apt-get install -y libtbb-dev libeigen3-dev
sudo apt-get install -y python3-dev python3-tk python3-numpy
sudo apt-get install ffmpeg libxvidcore-dev libx264-dev libatlas-base-dev gfortran
# 编译文档需要安装
sudo apt install texlive doxygen
# gflags谷歌的命令行解析工具
sudo apt install *gflags*
sudo apt install *glog*
# tesseract是OCR相关库
sudo apt install *tesseract*
# VTK是图像库,安装控件1GB附近,应该用不到,先安装了
sudo apt install *vtk*
# 看日志的发现有个bs4模块,这里使用pip方式安装一下
sudo apt install python3-pip
pip install bs4
# 是视频流相关的库,*gstreamer*会安装失败有冲突
sudo sudo apt-get install libgstreamer*
# 安装`libjasper-dev`时提示无法定位,处理方法:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt upgrade
sudo apt install libjasper1 libjasper-dev

1.2 编译

# 下载解压源码
wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/master.zip
unzip -q opencv.zip
unzip -q opencv_contrib.zip
mkdir build; cd build
# 几分钟,该过程中会连接外网下载一些文件,可能会下载失败,不影响配置的成功
# 下载失败可以采用先下载好再拷贝进去的方法,参考【2.2 配置过程中下载文件】
# 编译安装,使能QT支持,使能py3支持,设置安装路经为/opt/opencv,生成opencv4.pc文件,编译第三方模块
cmake \
-D BUILD_DOCS=ON \
-D BUILD_opencv_python3=yes \
-D BUILD_opencv_python2=no \
-D PYTHON3_EXECUTABLE=/usr/bin/python3.8 \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.8 \
-D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0 \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-D WITH_QT=ON \
-D Qt5_DIR=/opt/Qt5.14.2/5.14.2/gcc_64/lib/Qt5 \
-D WITH_OPENGL=ON \
-D CMAKE_INSTALL_PREFIX=/opt/opencv \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules \
../opencv-master
# 纯系统20分钟,虚拟机30分钟,安装后编译文件夹不要删除,以后开启新特性时可以在这个文件夹下追加编译,会比较快
make -j8 > log.txt 2> log_err.txt

1.3 安装

# 1分钟,我安装在/opt目前这个目录是root的,所以需要sudo安装
sudo make install
# 添加动态库到系统环境,PKG_CONFIG_PATH会被pkg-config使用,编译时用于提供opencv的信息
sudo bash -c 'echo /opt/opencv/lib > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/opencv/lib/pkgconfig" >> ~/.bashrc
. ~/.bashrc

2. 插曲

2.1 生成pkgconfig文件

我一开始不知道opencv4编译不会生成pkg-config使用的pc文件,编译安装后,我使用以下步骤进行补救,在配置的时候增加-DOPENCV_GENERATE_PKGCONFIG=ON参数,因为编译的临时文件都在,所以make -j8很快就结束了,顺利生成了./unix-install/opencv4.pc,sudo make install即可。参考linux下编译安装opencv生成opencv.pc。

2.2 配置过程中下载文件

后来发现在配置的时候cmake会从网上下载一些文件,会访问https://raw.githubusercontent.com,这个域名访问不通,了解到需要改/etc/hosts文件,修改后仅成功下载部分文件。最后了解到可以通过迅雷离线下载的方式进行下载。百度搜索迅雷离线网页版,CMakeDownloadLog.txt文件中有记录需要下载的文件地址,将该地址填写到迅雷中秒下,然后拷贝到.cache目录下,修改名称为校验值-文件名。再次执行配置的时候需要下载的文件就已经就绪了。参考raw.githubusercontent无法访问、OpenCV编译CUDA模块face_landmark_model.dat下载失败的解决方法。

2.3 Qt5未检测到

因为我的Qt5是自己安装的,虽然指定了-DWITH_QT=ON,但配置的结果显示没有找到QT,查看CMakeCache.txt发现是因为Qt5_DIR未定义,于是增加-DQt5_DIR=/opt/Qt5.14.2/5.14.2/gcc_64/lib/Qt5即可。参考CMake配置VTK时Qt5_DIR-NOTFOUND的解决方法。

2.4 QT不支持OpenGL

Qt5检测到了,但显示不支持OpenGL,发现CMakeList.txt中有WITH_OPENGL选项,增加-DWITH_OPENGL即可。

3. 运行示例

参考读取视频,读取摄像头。

3.1 c++

main.cpp
#include "opencv2/opencv.hpp"

int main()
{
	cv::VideoCapture cap;
	cv::Mat frame0, frame1;
	uchar c;

	cap.open(0); // 打开摄像头
	if(!cap.isOpened())
		return -1;

	while(1)
	{
		cap.read(frame0); // 读取一帧图像
		if(frame0.empty())
			continue;
		cv::Canny(frame0, frame1, 30, 100); // 边缘检测处理
		cv::imshow("Camera", frame1); // 显示画面
		c = cv::waitKey(20); // 延时20ms,等待按键按下
		if(c != 0xFF) // 若有按键按下则退出
			break;
	}

	cap.release();
	cv::destroyAllWindows();

	return 0;
}
编译运行
# pkg-config读取opencv4.pc得到opencv4的头文件路径和所有的动态库
g++ main.cpp `pkg-config opencv4 --cflags --libs`
./a.out

3.2 qt

qmake中使用opencv需要将opencv的头文件和库添加到工程中,方法如下。参考使用pkg-config输出将库链接到QT项目 。

修改pro文件,增加下面两行即可

CONFIG += link_pkgconfig PKGCONFIG += opencv4