☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython

一、引言

在老猿CSDN的博文《构建VisualStudio2019+OpenCV4.3的C++ windows编译环境》中详细介绍了windows下怎么构建visual studio 2019+OpenCV4.3d的C++编译环境,换了国产电脑后,上述方法已经不能使用,需要寻求统信Linux下构建OpenCV的C++编译环境的方法,经过多次尝试,解决了一些遇到的坑,终于成功在统信UOS下构建了OpenCV的C++编译环境,下面就详细进行介绍。

二、下载OpenCV版本

版本的下载方法还是《构建VisualStudio2019+OpenCV4.3的C++ windows编译环境》介绍的方法,该方法不下载OpenCV的代码不要上GitHub,国内可以直接访问,比较方便。

老猿还是选择的4.3.0的版本,不过下载的操作系统版本不能是windows的版本,必须下载Linux下的版本,在网站上有zip版本和tar版本,老猿选择下载的zip版本,如图: 下载后,该zip文件名带空格和点,为了便于操作,老猿将其改名为“OpenCV430.zip”,解压该zip文件到自己想要安装的目录,默认解压到安装目录的“opencv-opencv-207f357”子目录,直接将该子目录改名为“OpenCV430”,在老猿的机器上完整的安装目录路径为:/home/openCV/OpenCV430,前面2层目录就是选定的安装目录。

解压后,在目录下能看到的文件列表如下:

可以看到,该目录下有个CMakeLists.txt文件,这就是cmake的配置文件,有关cmake的介绍请参考老猿在CSDN的博文《信创之国产浪潮电脑+统信UOS操作系统体验2:安装visual studio code和cmake搭建C++开发环镜》的介绍,这说明OpenCV的编译需要借助cmake进行。

三、进入终端并切换为root用户操作

为了执行相关操作,减少权限问题的影响,进入linux终端操作模式,并执行:

sudo -i

用于以root用户身份登录到系统,后续操作都是在root用户下操作。

四、安装依赖组件

opencv安装依赖很多组件,如果没有预先安装这些组件中的部分,就会导致opencv安装后执行时报错,因此需要预先安装这些组件:

apt install build-essential

apt install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev

apt install libjasper-dev

apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev

apt install libxvidcore-dev libx264-dev

apt install libatlas-base-dev gfortran

apt install ffmpeg

这里补充说明几点: 1、依赖库的安装必须在执行opencv安装的cmake之前; 2、这里是列出了所有应该提前安装的库,但可能有部分库已经存在了,例如ffmpeg在老猿机器上原来就有,另外有部分库可能统信没有,如在老猿机器上无法安装libjasper-dev; 3、执行上述指令是前面以root用户登录为基础的,如果没有以root用户登录,则需要在这些指令前增加sudo。

四、cmake处理

为了顺利执行cmake,并为后续步骤准备好条件,需要按如下步骤进行cmake处理。

4.1、新建build子目录

为了执行cmake,在/home/penCV/OpenCV430下新建子目录build(原因请参考老猿在CSDN的博文《统信UOS Linux环境下安装OpenCV遇到的各种问题及填坑指南》)。

4.2、ADE处理

ADE(Automatic Differentiation Engine)是OpenCV中的一个模块,用于自动计算图像处理算法的导数。它可以根据输入和输出之间的关系,自动计算算法的梯度,从而实现自动微分。在OpenCV的编译过程中,如果使用了gapi模块,会自动下载并编译ADE,以支持自动微分功能。

在执行cmake过程中会自动到GitHub下载当前OpenCV版本对应的ADE文件,但如果安装机器所在的网络环境允许访问GitHub,则可以跳过该步骤,本步骤是专门针对机器环境无法访问GitHub进行的。

具体处理过程请参考老猿在CSDN的博文《机器环境无法访问GitHub情况下linux安装OpenCV执行cmake无法下载ADE文件v0.1.1f.zip》的介绍。

4.3、执行cmake指令

ADE处理后,就可以进入真正的cmake执行了。

进入build子目录后执行如下命令:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv430 -D OPENCV_GENERATE_PKGCONFIG=ON ..

这个指令指定设定了如下内容:

安装OpenCV的发行版本(其实不指定CMAKE_BUILD_TYPE也是安装发行版本)指定其安装目录为/usr/local/opencv430,不指定的话默认安装目录为/usr/local由于CMakeLists.txt文件在build目录的父目录中,因此指定cmake的目录为..

实际上述指令也可以使用:cmake …,不指定前面的两个变量参数,这样只是安装目录不同,同时无法生成opencv.pc文件(关于该文件请参考老猿在CSDN的博文《统信UOS Linux环境下安装OpenCV遇到的各种问题及填坑指南》的介绍)。

cmake执行完毕后最后给出信息如下:

-- Install to: /usr/local/opencv430

-- -----------------------------------------------------------------

--

-- Configuring done

-- Generating done

-- Build files have been written to: /home/openCV/OpenCV430/build

cmake执行后和执行前,/usr/local目录其实没有变化,下面是老猿机器上的/usr/local`下目录内容情况: 其中include目录下内容为空,lib目录下有如下两个子目录: 这两个子目录下只有几个空目录,没有任何文件。

五、执行make指令

cmake处理完成之后,在build目录下准备好了进行make的相关文件和目录,如图: 可以看到Makefile已经生成,此时就可以执行make指令了。

make的执行很慢,但提供了多线程并行执行的能力,老猿机器CPU为8核,因此编译指令为: make -j8 表示启动8个线程并行编译,编译过程花了17分钟,如果是单线程,可能要近2个小时。

编译完成后,在build目录下产生了大量文件和目录,bin目录下生成了一些执行文件,在lib目录生成了一些库文件,等等,此时可以执行bin目录下的一些程序进行测试。例如:

root@jwp:/home/openCV/OpenCV430/build/bin# ./opencv_version

4.3.0

六、安装

编译完成后,就可以安装OpenCV文件和库了,执行指令为:

make install

make install指令的用途是将编译生成的可执行文件、库文件和其他必要的文件安装到系统中的指定位置,并在系统中进行配置,以便其他程序可以使用这些文件。

在老猿机器上安装的路径就是前面cmake配置的/usr/local/opencv430,我们来看看该目录下的内容: 包括4个子目录,bin、include、lib、share,重点看看include目录: include目录下有2级子目录,include和OpenCV4目录下都只有一个子目录名,真正的头文件都存放在opencv2子目录下。

七、调整登录用户的shell环境配置

通过前面的步骤,整个OpenCV4.3在老猿的机器上就都安装成功了,按理来说后续就可以在应用程序中调用OpenCV库文件和头文件进行OpenCV编程了,但不同环境配置对编译指令的参数要求不同,具体请参考老猿在CSDN的博文《统信UOS linux下opencv应用编译时的头文件和库文件路径查找设置方法》的介绍。

老猿推荐使用环境变量和opencv.pc文件来简化编译指令的参数,为此需要将头文件路径、库文件路径以及opencv.pc文件路径都写入到登录用户主目录的“.bashrc”文件中,在老猿机器环境中,对应登录用户“.bashrc”关于opencv配置的有关换行变量内容如下:

administrator@jwp:~$ pwd

/home/administrator

administrator@jwp:~$ tail -n 6 .bashrc

export CPLUS_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$CPLUS_INCLUDE_PATH

export C_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$C_INCLUDE_PATH

export LIBRARY_PATH=/usr/local/opencv430/lib:$LIBRARY_PATH

export PKG_CONFIG_PATH=/usr/local/opencv430/lib/pkgconfig

export LD_LIBRARY_PATH=/usr/local/opencv430/lib:$LD_LIBRARY_PATH

administrator@jwp:~$

大家可以参考老猿的配置根据opencv安装路径调整上述配置内容,调整后重新登入终端生效,这样调整指令后,不用在g++编译指令中带-I和-L参数,也不用带-l参数来指定库文件,而是使用:\ pkg-config --libs opencv\参数,对所有opencv的应用都生效。 如老猿编译test.cpp,使用指令如下:

administrator@jwp:~/E_DRIVER/opencv/test$ g++ -o test test.cpp `pkg-config --libs opencv`

administrator@jwp:~/E_DRIVER/opencv/test$

注意:

make install安装完后,在安装目录(如/usr/local/opencv430)下的lib/pkgconfig目录下,生成的文件是opencv4.pc,这样的话上面编译指令的pkg-config --libs opencv应该为:pkg-config --libs opencv4,为了兼容,可以将opencv4.pc复制一份到opencv.pc;pkg-config --libs opencv一定要用符号`(这个字符称为可显示字符,不是单引号,一般键盘布局是在数字1前面,和波浪线共用一个键)首尾进行标记。

八、测试

完成以上工作后,opencv库的安装完成,具备opencv应用调用API进行图像处理的能力,程序就可以编译执行了。

为了验证环境的可用性,可以用下面的代码进行验证:

#include

int main()

{

// 读取图片

cv::Mat image = cv::imread("文件目录用途.png");

// 检查是否成功读取图片

if (image.empty()) {

std::cout << "无法读取图片" << std::endl;

return -1;

}

// 创建窗口并显示图片

cv::namedWindow("Image", cv::WINDOW_NORMAL);

cv::imshow("Image", image);

// 等待按下任意键后关闭窗口

cv::waitKey(10000);

cv::destroyAllWindows();

return 0;

}

执行指令:g++ -o test test.cpp pkg-config --libs opencv 进行编译,老猿的pc文件未改名,因此使用opencv4,具体执行情况如下:

administrator@jwp:~/E_DRIVER/opencv/test$ g++ -o test test.cpp `pkg-config --libs opencv4`

administrator@jwp:~/E_DRIVER/opencv/test$ ./test

在vscode中编译执行测试程序的界面截图如下:

九、小结

本文详细介绍了在统信UOS的linux操作系统环境下安装opencv库和构建opencv C++应用的编译环境的详细过程,通过下载安装包、调整cmake文件、执行cmake和make以及安装,调整环境变量等,最终构建了可以编译opencv C++应用程序的环境。

上述安装过程是老猿反复多轮测试之后总结出来的,其实在测试过程中中遇到了各种问题,通过解决这些问题,才最终成功,这些遇到的问题老猿已经记录,详细内容请参考老猿在CSDN的博文《统信UOS Linux环境下安装OpenCV遇到的各种问题及填坑指南》的介绍。

后记:

在编译安装opencv的过程中,看到这么庞大的工程通过cmake将其组织构建起来,检测并适配各种复杂环境,真的被这样的开源项目惊呆了,opencv是图像处理的利器,其项目的编译组织也值得吾辈之人好好学习。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

更多关于统信操作系统及opencv的介绍的内容请参考专栏《国产信创之光》的其他文章。

关于老猿的付费专栏

付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: