本书使用Qt Creator开发OpenCV,其最大的优点就是跨平台。当前,支持跨平台几乎是所有商业应用软件的标配。
在前面的章节中,我们使用MinGW在Windows环境下实现了OpenCV的编译。MinGW本质上是基于GCC编译器,而GCC源自Linux系统。因此,既然我们能够在Windows上成功编译OpenCV,那么在Linux下编译OpenCV源码更是小菜一碟了。当然,如果读者急于学习OpenCV的相关知识,可以暂时跳过本节,直接学习后面的内容。后续内容主要基于Windows下的Qt Creator进行介绍。本节的内容可以先保留,以便在未来进行Linux开发时(例如在银行、航天等关键领域的应用开发,通常都是在国产Linux系统上进行),再回过头来参考。此外,后续章节中的项目源码既可以在Windows上编译运行,也可以在Linux上编译运行。支持跨平台开发是本书的一大优点,同时也是为将来在嵌入式开发板上进行OpenCV应用开发做好准备。
这里我们在经典的Ubuntu20.04上编译OpenCV。为了节省成本,我们把Ubuntu安装在VMware虚拟机上,假定读者已经安装好,并以root账户登录到Ubuntu了,下面开始我们的编译工作。
编译OpenCV所需的依赖首先是两个编译相关的基础依赖:cmake和make,它们都和构建有关。build-essential是一个软件包,它的主要作用是在系统上安装一组基本的编译工具(比如gcc)和库文件(比如C语言运行时库等)。
sudo apt install -y cmake make sudo apt install -y build-essential
下面这些依赖就不一一说明了,大部分都是关于图片分析和图片处理的依赖。
sudo apt install -y libgtk2.0-dev sudo apt install -y libavcodec-dev sudo apt install -y libavformat-dev sudo apt install -y libjpeg-dev sudo apt install -y libtiff-dev sudo apt install -y libswscale-dev sudo apt install -y libpng-dev sudo add-apt-repository "deb <http:// security.ubuntu.com/ubuntu> xenial-security main"
add-apt-repository的意思是添加软件源(指向Ubuntu的安全更新存储库)。注意:添加这个软件源后才能找到libjasper-dev这个包依赖。
sudo apt update sudo apt install -y libjasper-dev sudo apt install -y freeglut3-dev sudo apt install -y libgl1-mesa-dev sudo apt install -y pkg-config
gstreamer相关的依赖如下:
sudo apt update sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-good1.0-dev sudo apt install -y gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install -y gstreamer1.0-tools gstreamer1.0-libav sudo apt install -y gstreamer1.0-doc gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
此处依赖是需要用到gstreamer相关依赖才进行下载的,如果无须用到,可以不下载此处依赖,后续cmake命令中的参数也需要进行相应的调整。
安装gtk2支持:
sudo apt-get install libgtk2.0-dev
安装gtk3支持:
sudo apt-get install libgtk-3-dev
把编译OpenCV之前需要准备的依赖全部安装完成后,就可以正式开始编译OpenCV了。官网下载OpenCV源码或者把配套资源somesofts目录(后文提到此目录都是指配套资源)下的OpenCV源码文件4.10.0.zip上传到Linux的某个文件夹下,比如/root/soft/,然后进入目录/root/soft进行解压:
unzip 4.10.0.zip
那我们的OpenCV源码路径就是/root/soft/opencv-4.10.0,这个路径后面要用到。进入/root/soft/opencv-4.10.0,在该路径下新建一个文件夹“.cache”,并把somesofts\cmake需要的\Ubuntu\.cache\下的两个子文件夹上传到/root/soft/opencv-4.10.0/.cache,这个.cache目录会存放CMake下载的文件。然而,由于下载太慢,导致无法上传成功,因此笔者采用其他方式把所需的文件全部下载好并放到.cache下,这样CMake一看已经存在需要下载的文件了,就不会再去下载,也就不会卡死了。
另外,我们还需要建立一个空文件夹,用于存放OpenCV编译后的文件,这里在/root/soft下新建一个opencvBuild文件夹,命令如下:
mkdir -p /root/soft/openvBuild
因为编译大型源码需要Makefile,下面我们准备在CMake下生成Makefile文件。这里和在Windows下一样,也使用CMake GUI图形软件,因此我们要在Ubuntu图形界面中进行。安装CMake GUI软件的命令如下:
apt-get install cmake-gui
安装完毕后,在终端窗口上输入如下命令启动CMake GUI:
cmake-gui
然后在CMake窗口上的Where is the source code旁输入“/root/soft/opencv-4.10.0”,这个路径就是OpenCV源码所在的路径;在Where to build the binaries旁输入“/root/soft/openvBuild”,这是编译后存放文件的目录。然后单击Configure按钮,在出现的对话框上保持默认选择,如图2-28所示。
单击Finish按钮后,CMake开始工作。稍等片刻,工作完成,如果出现很多红色条目,那就再单击Configure按钮,第二次结束时就不会有很多红色条目了。我们在Search搜索框中输入IPP,去掉WITH_IPP和BUILD_IPP_IW的勾选。如果最终要生成静态库(.a),那么还要去掉BUILD_SHARED_LIBS的勾选。这里我们准备生成动态(共享)库(.so),因此保持BUILD_SHARED_LIBS处于勾选状态(默认)。另外,如果我们要指定编译后的安装(make install文件夹,则可以通过选项CMAKE_INSTALL_PREFIX来设置指定目录,默认是/usr/local。
图2-28
再次单击Configure按钮,CMake配置完成后的界面如图2-29所示。
图2-29
CMake的配置工作完成后,就可以单击Generate按钮来生成Makefile文件了,这一步一般不会出错。成功后,我们可以在opencvBuild目录下看到Makefile文件,下面就可以开始编译了。
在终端窗口下进入opencvBuild目录,然后输入make命令开始漫长的编译。因为我们是在虚拟机中编译的,所以编译过程注定是漫长的。
另外细心的读者可能会有疑问,Windows下用到了“-j”这个选项,也就是使用了多线程编译,为何现在仅用一个make了?其实,笔者一开始的确是用“make -j8”命令来进行多线程编译的,但是在编译过程中发现,前期编译速度很快,但是编译到大概70%的时候,速度就越来越慢,一个上午的时间只编译了5%,后来就一直卡在93%。笔者觉得有些奇怪,就打开htop查看了进程信息,发现编译的进程根本没有运行,CPU的占用率也不太正确。进程的状态是D,表示进程正处于不可中断的等待状态。估计是编译器的堆反应空间不足了,OpenCV编译被卡住了。
笔者只好重新编译,但是这次没有使用多线程进行编译,只用了make命令,果然正常了。因此,这里直接推荐读者用make来编译,虽然或许会慢一点,但至少不会卡死。也可以第一次执行make -j8,然后卡死,再执行make,第二次的make会在第一次卡死(也就是没有编译成功)的地方继续,这样或许总时间反而比一开始就用make来得快些。以上都是经验和教训之谈。
最后编译结束,如下所示:
... [ 99%] Building CXX object modules/gapi/CMakeFiles/opencv_test_gapi.dir/test/util/variant_tests.cpp.o [ 99%] Linking CXX executable ../../bin/opencv_test_gapi [ 99%] Built target opencv_test_gapi [ 99%] Built target opencv_annotation [100%] Built target opencv_visualisation [100%] Built target opencv_interactive-calibration [100%] Built target opencv_version [100%] Built target opencv_model_diagnostics root@bush-virtual-machine:~/soft/opencvBuild#
编译完成之后,输入如下命令进行安装:
make install
稍等片刻,安装结束,如下所示:
... -- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface.xml -- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface_improved.xml -- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_profileface.xml -- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_silverware.xml -- Installing: /usr/local/bin/opencv_annotation -- Set runtime path of "/usr/local/bin/opencv_annotation" to "/usr/local/lib" -- Installing: /usr/local/bin/opencv_visualisation -- Set runtime path of "/usr/local/bin/opencv_visualisation" to "/usr/local/lib" -- Installing: /usr/local/bin/opencv_interactive-calibration -- Set runtime path of "/usr/local/bin/opencv_interactive-calibration" to "/usr/local/lib" -- Installing: /usr/local/bin/opencv_version -- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib" -- Installing: /usr/local/bin/opencv_model_diagnostics -- Set runtime path of "/usr/local/bin/opencv_model_diagnostics" to "/usr/local/lib" root@bush-virtual-machine:~/soft/opencvBuild#
这里采用默认位置安装,因此会安装到如下目录:/usr/local/bin、/usr/local/lib和/usr/local/share。例如我们可以查看版本信息:
# /usr/local/bin/opencv_version 4.10.0
也可以直接用命令查看版本信息:
# opencv_version 4.10.0
/usr/local/lib存放的是编程所需的库文件,主要是以libopencv开头的so文件。编程所需的OpenCV头文件则在/usr/local/include/opencv4/opencv2/下。
准备工作终于完成了,我们可以开始在Linux下编写OpenCV程序了。
【例2.3】Linux下的第一个OpenCV程序
步骤01 在Linux下的某个路径(这里是/root/ex/)下新建一个文件夹opencvTest,然后在该文件夹下新建一个源文件helloworld.cpp:
gedit helloworld.cpp
在helloworld.cpp文件中输入如下代码:
代码逻辑很简单,就是去读取当前目录下的p1.jpg,然后将其显示出来。其中,Mat即Matrix(矩阵)的缩写,是OpenCV最基本的数据结构。Mat数据结构主要包含两部分:Header和Pointer。Header中主要包含矩阵的大小、存储方式、存储地址等信息;Pointer中存储指向像素值的指针。总之,Mat可以在内存中存储图像文件数据。imread用于读取图像文件;imshow用于显示图像。这些函数后续还会详述,现在只需了解即可,因为现在的目的是要验证Linux下OpenCV开发环境是否正常。
步骤02 保存helloworld.cpp文件,用g++编译并运行。在终端窗口上输入如下命令:
g++ helloworld.cpp -std=c++11 -I /usr/local/include/opencv4/ -L /usr/local/lib -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -o hello
在命令中,先用-I指定了头文件所在路径,由于在程序的include中已经写了opencv2,因此这里只需包含到opencv4即可,而opencv2就在opencv4下;再用-L包含库文件的路径,注意-I和-L后面都有一个空格;接着用-l指定要链接的动态库,一共4个;最后用-o指定生成的可执行文件的文件名为hello。
命令运行后,会在当前目录下生成hello这个可执行程序。我们把p1.jpg放到hello同一路径下,然后运行hello:
./hello
运行结果如图2-30所示。
图2-30
步骤03 除了用g++编译程序外,经验丰富的开发人员更喜欢用CMake/Make方式,也就是先通过CMake生成Makefile,再用Make生成可执行文件。下面也来演示一下,在opencvTest文件夹下新建文本文件CMakeLists.txt,然后输入如下代码:
01 cmake_minimum_required(VERSION 2.8) 02 project( opencvTest ) 03 find_package( OpenCV REQUIRED ) 04 include_directories( ${OpenCV_INCLUDE_DIRS} ) 05 add_executable( opencvTest helloworld.cpp ) 06 target_link_libraries( opencvTest ${OpenCV_LIBS} )
这是很简单的CMakeList代码,具体解释如下:
第01行代码的意思是要求CMake最低版本为2.8。
第02行代码指定本项目的工程名为opencvTest。
第03行代码引入外部依赖包,一般格式是find_package(xxx REQUIRED)。例如,在编译某个工程时,如果需要使用OpenCV,则在CMakeLists.txt中需要添加find_package(OpenCV REQUIRED)。其原理是寻找OpenCVConfig.cmake文件,该文件中指定了OpenCV的库路径和头文件路径,从而使得编译时能够找到相应的头文件和库文件。如果不进行任何调整,find_package(OpenCV REQUIRED)会在默认路径中查找OpenCVConfig.cmake。然而,如果系统默认路径中的OpenCV版本不是我们所需的,我们在某个路径下自行编译并安装了更高版本的OpenCV,然后在编译工程时希望CMake能够找到我们自己编译的OpenCV版本的OpenCVConfig.cmake。此时,可以使用set(CMAKE_PREFIX_PATH xxx)来指定搜索路径。由于本例我们将OpenCV的编译结果安装到了默认目录,在默认路径/usr/local/lib/cmake/opencv4/下可以找到OpenCVConfig.cmake,因此本例不需要使用set(CMAKE_PREFIX_PATH xxx)。
使用find_package找到.cmake或.pc文件,找到后相关的头文件和库文件路径会分别保存在指定变量中,如XXX_INCLUDE_DIRS、XXX_LIBRARIES,此时再通过include_directories或link_directories一键引入所有的库和头文件路径。这里,我们通过第3行代码把头文件路径存放在OpenCV_INCLUDE_DIRS中。
第04行代码添加头文件路径到编译器的头文件搜索路径下,多个路径以空格分隔。
第05行代码中的第一个参数表示要生成的可执行文件名为openTest,后面的参数是需要的源码文件。
保存CMakeLists.txt文件然后在终端窗口下执行:
# cmake . -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found OpenCV: /usr/local (found version "4.10.0") -- Configuring done -- Generating done -- Build files have been written to: /root/ex/opencvTest
注意cmake后面有一个空格和黑点。文件运行后会在当前目录下生成Makefile,然后我们就可以使用make命令来生成可执行文件opencvTest了,命令如下:
# make Scanning dependencies of target opencvTest [ 50%] Building CXX object CMakeFiles/opencvTest.dir/helloworld.cpp.o
[100%] Linking CXX executable opencvTest [100%] Built target opencvTest
最后运行可执行文件opencvTest:
# ./opencvTest
运行结果也是显示图片p1.jpg,这里就不截图了。
至此,Linux下的简陋的OpenCV开发环境就建立起来了。为何说简陋呢?因为目前没有用到IDE。下面就来使用Qt Creator。
这里使用Qt6,在Linux下笔者一般喜欢用较新的版本,因为无论操作系统还是应用软件,都是免费的。同时使用Qt6也是为了更好地测试OpenCV。Windows用Qt5来测试OpenCV,Linux用Qt6来测试OpenCV,这样我们就可以知道OpenCV是否能和不同的Qt版本兼容。
我们可以到以下地址下载Linux环境下的Qt在线安装包:
https:// download.qt.io/archive/online_installers/4.3/
进入网页后单击qt-unified-linux-x64-4.3.0-1-online.run,然后开始下载。如果网址失效或不想下载,也可以直接到源码目录的子文件夹somesofts下找到Qt的安装包。
如果下载下来的文件存放到Windows中,下一步还需要把它存放到虚拟机Ubuntu中。在虚拟机的桌面上,单击左边工具栏中的第三个按钮来打开文件资源管理器,如图2-31所示。
在新出现的文件资源管理器窗口中单击左边的“主目录”,然后单击右上角查询图标旁的排列图标,如图2-32所示。这样操作主要是可以在窗口中留出更多空白区域以方便我们新建文件夹。
在空白处新建文件夹,并将这个文件夹命名为soft(如果soft文件夹已经建立过了,则不需要再建立),然后用鼠标双击它进入这个文件夹,再把前面下载到Windows下的qt-unified-linux-x64-4.3.0-1-online.run文件复制并粘贴到该文件夹中,或者直接拖进去。注意,粘贴进度条即使消失了,也要稍等一会儿才能真正完成粘贴操作。如果操作一切正常,选中该文件后,它的右下角会显示文件的大小(36.6MB),如图2-33所示。
图2-31
图2-32
图2-33
这样,下载下来的Qt安装包就复制粘贴到虚拟机Ubuntu中了。
在安装Qt前,我们先要联网安装一些依赖性软件包,以免安装过程中提示找不到依赖包。在终端窗口中依次输入如下命令:
apt-get install build-essential apt-get install g++ apt-get install libx11-dev libxext-dev libxtst-dev apt-get install libxcb-xinerama0 apt-get install libgl1-mesa-dev apt-get install libxcb-cursor0
每个命令输入后都会自动安装对应的依赖包,如果安装过程中有询问,就采用默认值;如果有些包已经装过了,则会提示该包当前已是最新。倒数第二个命令是安装OpenGL核心库,最后一个是安装xcb-cursor0库(最重要的),这是Qt6.5必须安装的,否则Qt Creator启动不了。
依赖包安装完毕后,就可以开始安装Qt了。在Ubuntu下打开终端窗口,进入/root/soft目录,为文件qt-unified-linux-x64-4.3.0-1-online.run添加执行权限:
chmod +x qt-unified-linux-x64-4.3.0-1-online.run
添加执行权限后,就可以开始安装Qt 6了。继续运行命令:
./qt-unified-linux-x64-4.3.0-1-online.run
然后就会出现安装向导窗口,和Windows下安装一样,必须输入有效的账号和密码才能进行下一步操作。如果没有账号,可以注册一个。
输入账号和密码后,单击“下一步”按钮,在出现的对话框界面上勾选“我已阅读并同意使用开源Qt的条款和条件”和“我是个人用户,我不为任何公司使用Qt”两行文字前的复选框,然后单击“下一步”按钮。其实这个过程跟Windows下的类似。持续单击“下一步”按钮,进入“安装文件夹”界面,保持默认设置,安装到/opt/Qt6路径下,并在下方选中Qt6.7 for desktop development,如图2-34所示。
图2-34
再单击“下一步”按钮,出现“许可协议”对话框,在下方打勾。再单击“下一步”按钮,出现“准备安装”对话框,这个时候就有可能出现状况了,如图2-35所示。
图2-35
这是因为磁盘空间不够了。当然,不是每个人都会出现这个情况,这里是因为笔者的磁盘上原有内容比较多,而且安装虚拟机Linux的时候使用了默认的20GB硬盘空间,所以现在就出现这个提示了。如果没有这个提示,可以单击“安装”按钮正式开始安装。如果出现这个提示,单击“取消”按钮来关闭安装向导,然后跟着笔者扩充容量。基本思路是为虚拟机Linux添加一个磁盘,并把Qt安装到这个磁盘上。步骤如下:
步骤01 添加新硬盘。先关闭Ubuntu,然后在VMware中单击“编辑虚拟机设置”,如图2-36所示。
图2-36
在“虚拟机设置”对话框的“硬件列表”里选中“硬盘(SCSI)”,并单击下方的“添加”按钮,此时出现“添加硬件向导”对话框,我们直接单击“下一步”按钮,随后几个步骤一直保持默认设置,直接单击“下一步”按钮即可。笔者这里添加的新磁盘的容量是20GB,如图2-37所示。
图2-37
添加完成后,在“虚拟机设置”的硬件列表中就可以看到多了一个新硬盘了,如图2-38所示。
图2-38
这样我们的虚拟机Linux一共有40GB的空间了。
步骤02 开启虚拟机Ubuntu,打开终端窗口,输入命令fdisk -l。这个命令可以查看当前硬盘空间的信息。我们可以找到新添加的磁盘sdb,如图2-39所示。
图2-39
然后对其进行格式化。这个概念和Windows一样,新加的硬盘肯定要建立起文件系统才能使用,这里我们用mkfs.ext3命令把硬盘格式化成ext3文件系统,输入命令如下:
mkfs.ext3 /dev/sdb
稍等片刻,格式化完成,如图2-40所示。
图2-40
步骤03 格式化完成后,我们再将这个磁盘挂载到一个文件夹。这个文件夹必须先建立,输入命令如下:
mkdir /wwwroot
名字可以自己定义。然后我们将磁盘挂载到文件夹/wwwroot下,输入命令如下:
mount /dev/sdb /wwwroot
如果没有提示信息,说明挂载成功了,如图2-41所示。
图2-41
现在往/wwwroot下存放数据,就相当于存放到/dev/sdb下了。
步骤04 我们启动Qt安装程序(命令行下执行/root/soft/qt-unified-linux-x64-4.3.0-1-online.run),然后在Qt安装向导的“安装文件夹”对话框上,将安装路径指定到/wwwroot/Qt6,如图2-42所示。
图2-42
此时单击“下一步”按钮,就没有提示磁盘空间不够的信息了,直接提示已经准备安装了,如图2-43所示。
图2-43
步骤05 继续单击右下方的“安装”按钮,开始正式安装,这个过程比较漫长,同时要保持网络在线,因为现在都是在线安装了,如图2-44所示。
图2-44
安装完成后,给出提示,如图2-45所示。
图2-45
至此,Linux下安装Qt6完成,我们可以在/wwwroot文件夹下看到Qt6子文件夹了,并且qtcreator可执行程序位于./Tools/QtCreator/bin/下。下面启动qtcreator,输入如下命令:
/wwwroot/Qt6/Tools/QtCreator/bin/qtcreator
这个命令可以在任意路径下启动qtcreator,因为我们带上了全路径。如果先进入/wwwroot/Qt6/Tools/QtCreator/bin/下,则只需执行./qtcreator即可,其中./表示在当前路径下执行。第一次启动比较慢,稍等一会儿,qtcreator就启动了,如图2-46所示。
图2-46
相信到这会儿读者已经迫不及待地想要新建项目文件。前面已经介绍过新建项目的过程,这里不再赘述。这就是跨平台软件的好处,一旦学会如何在Windows下使用,那么到了Linux下,用起来也基本一样。注意:每次重启后,要先把sdb加载到/wwwroot下,命令如下:
mount /dev/sdb /wwwroot
再启动qtcreator。下面来看一个例子。
【例2.4】Linux下用Qt开发的OpenCV程序
步骤01 在虚拟机Ubuntu的终端窗口中输入如下命令来启动Qt Creator:
/wwwroot/Qt6/Tools/QtCreator/bin/qtcreator
步骤02 在Qt Creator主界面上,依次单击主菜单中的“文件→New Project”选项,随后弹出New Project—Qt Creator对话框,在该对话框上选中Qt Console Application选项,如图2-47所示。
图2-47
步骤03 单击右下角的“选择”按钮,出现Project Location设置界面,在该界面中输入名称test,路径随便输,但要确保路径已经存在,这里输入/root/ex,文件夹ex已经预先建立好,如图2-48所示。
图2-48
步骤04 继续单击“下一步”按钮,出现Define Build System设置界面,我们选择Build system(构建系统)为“qmake”,如图2-49所示。
图2-49
qmake是Qt工具包自带的一个非常方便的工具,可以用于生成Makefile以及各种工程文件,还可以生成Microsoft Visual Studio可以使用的项目文件等。最关键的是它可以自动解决依赖关系,不用手写Makefile,而且是跨平台的。
步骤05 接着连续单击“下一步”按钮直到结束,这个过程一直保持默认设置即可。
步骤06 这样一个MainWindow程序框架就建立起来了。此时会自动打开main.cpp文件,并且该文件中已经有一些自动生成的代码了。我们把很多注释代码删除,然后在return语句前添加一行代码:
puts("Hello,welecom to opencv in Linux!");
步骤07 再单击左侧竖条工具栏上的“项目”,然后单击“运行”,再在右边勾选“在终端中运行”复选框,如图2-50所示。
图2-50
步骤08 单击左侧竖条工具栏上的“编辑”,切换到编辑窗口界面,然后单击竖条工具栏下方的三角按钮,这个就是运行程序的按钮,或直接按快捷键Ctrl+R来运行程序,运行结果如图2-51所示。
图2-51
可以看到,终端(Terminal)窗口中输出字符串了。这就说明Qt环境部署成功了。
步骤09 下面添加OpenCV代码。此时可以在/root/ex/test/build/Desktop_Qt_6_7_2-Debug/下看到可执行文件test。我们在main.cpp中输入如下代码:
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat img; // 定义矩阵结果变量img string imgpath = "plane.jpg"; // 文件plane.jpg要放到可执行文件同一目录下 img = imread(imgpath, 1); // 读取图像文件 if (img.data == NULL) puts("load failed"); // 如果读取失败,则提示加载失败 else imshow("img", img); // 显示图像 waitKey(0); // 等待用户按键 return 0; // 程序返回 }
代码很简单,就是从可执行文件同一目录下读取文件plane.jpg,然后把它显示出来。
步骤10 配置工程文件,添加头文件和库。打开test.pro,然后在末尾添加如下代码:
INCLUDEPATH += /usr/local/include/opencv4/ LIBS += -L /usr/local/lib -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
第一行是添加头文件的所在路径,第二行是设置库路径及其要加载的动态库。
步骤11 将图片plane.jpg存放到/root/ex/test/build/Desktop_Qt_6_7_2-Debug/,然后在Qt Creator中运行程序,运行结果如图2-52所示。
图2-52
至此,我们在Linux下搭建OpenCV开发环境成功!
前面我们把Linux下的Qt环境搭建起来了,为了保存劳动成果,可以用VMware软件做个快照。一旦系统出现故障,就可以使用快照恢复到Qt安装配置成功的状态。建议养成这样一个良好的习惯,即做两个快照,第一个是刚刚安装好操作系统的时候的快照,第二个是开发环境部署成功的时候的快照。