前言
记录一下本次在ubuntu18.04下opencv3.4.1的编写一个简单的显示图片程序,并使用CMake和make编译的心得。
一、前置准备
- 一个ubuntu18.04系统
- opencv3.4.1
- CMake与make
二、Cpp源码编写
opencv部分
安装好opencv3.4.1后,可以利用Cpp(C++)语言进行使用,只需要这样
#include <opencv2/opencv.hpp>
using namespace cv;
即可以在主函数里使用cv包的函数。本次使用的cv函数记录如下:
-
读取图片
image = imread( argv[1], 1 );
返回值image是Mat类型的,需要两个参数:argv[1]为打开路径,第二个参数为打开方式,填1即可;
-
打开一个用于展示图片的窗口
namedWindow("Display Image", WINDOW_AUTOSIZE );
需要两个参数:第一个为窗口名,第二个参数为窗口打开方式,填WINDOW_AUTOSIZE即可;
-
展示图片
imshow("Display Image", image);
需要两个参数:第一个为窗口名,image为要展示的图片;
基本上完成这些操作就能打开并展示图片了。
main()参数部分
main函数可以添加两个参数,
int main(int argc, char** argv )
第一个参数是指令行参数的个数(包括输入的可执行文件名),第二个参数就是你要传给程序的参数字符串(是一个字符串组,多个,指令行中参数之间以空格作为分隔符,同样包括输入的可执行文件名),主函数中使用时 argv[1] 即为外部指定的路径。
当程序编译成可执行文件(比如go)后,只需外部指定,像这样
./go 参数1 参数2
即可给参数赋值。
三、Cmake使用
-
为什么要用Cmake
简单来说,其实编译需要make,而make需要makefile文件引导,而makefile的编写太麻烦,不如让Cmake去写。写好后我们只需要在有makefile的文件夹下执行make命令即可。跟具体的参考这里https://blog.csdn.net/qq_27825451/article/details/103392719 -
Cmake的使用前
使用Cmake前,当前目录下一般有3个文件,源程序(.c或.cpp),CMakeLists.txt(引导Cmake编译),build目录(产生的文件,其中就有makefile),其中CMakeLists.txt里确定了最后make产生的可执行文件在哪里,也确定了项目的目录关系(头文件关系),这里简单说明CMakeLists.txt的写法(其中注释不建议复制,因为包含中文,可能影响编译):cmake_minimum_required(VERSION 2.8) #这句限定cmake最小版本,如这里是2.8。此句非必须,只是不写会出警告。 project( show ) #项目名,单文件时非必须 find_package( OpenCV REQUIRED ) #找到头文件需要的已经在系统里已经安装好的包(系统自带的包不需要) add_executable( show fun.cpp show.cpp ) #指定编译后可执行文件的地址(可用以cmake为基准的相对路径),与需要编译的文件,其中自定义头文件对应的源文件也需要编译 target_link_libraries( DisplayImage ${OpenCV_LIBS} ) #连接可执行文件与已经安装好的包,第一个参数是可执行文件,第二个是安装好的包的路径,这里使用的是系统变量 set(SOURCES src/Hello.cpp src/main.cpp) #设置变量,之后CMakeLists.txt中可以使用${SOURCES}引用
这里补充几个常用已经预定义的变量
PROJECT_SOURCE_DIR #CMake源码地址,即cmake命令后指定的地址 PROJECT_BINARY_DIR #运行cmake命令的目录,通常是PROJECT_SOURCE_DIR下的build目录 CMAKE_CURRENT_LIST_DIR #当前文件夹路径
cmake具体用起来就是一句命令
cmake 参数1
其中参数1是要cmake的CMakeLists.txt位置(一般源码也在一起),这句命令会在运行的目录下生成make所需的文件,之后执行
make
即可,完成编译,编译好的可执行文件默认就在运行的目录下,可以在CMakeLists.txt的add_executable指定更改。
-
Cmake的具体使用
如果源码目录下已经写好CMakeLists.txt,用终端进入(cd)源码目录,之后一次执行以下命令mkdir build cd build cmake .. make
即会在build目录下生成一些make所需文件,最后一句make会在此生成最终的可执行文件。
四、一点意外
在正常编译后,运行应用程序,我的虚拟机总会报出类似这样的警告,但不影响程序的运行:
Gtk-Message: 16:10:49.684: Failed to load module "canberra-gtk-module"
经过查询资料,在终端输入一下代码即可解决:
sudo apt-get install libcanberra-gtk*
最后搜索发现 libcanberra-gtk-moduel 是使用 libcanberra-gtk 来触发输入反馈事件声音的 Gtk+ 模块,所以仅仅是警告,不影响运行。