Ubuntu18.04下使用cmake编译一个OpenCV程序(编写CMakeLists.txt文件)

导航

  • 1.安装OpenCV
    • 1.1首先安装OpenCV。
    • 1.2定位OpenCV
  • 2.创建一个项目
  • 3.编写一个基础OpenCV程序
  • 4.编写CMakeLists.txt文件

为了记录以及防止遗忘,备份一个大致能满足运行的CMakeLists.txt文件编写。由于是使用嵌入式运行,当运行在树莓派或者Jetson时对资源的使用是比较敏感的,而只用命令行就能解决问题是一件很酷的事。

1.安装OpenCV

1.1首先安装OpenCV。

自己根据需要选择自己所需要的版本。推荐一篇博客:
ubuntu安装opencv的正确方法.
OpenCV的版本号由主版本号,次版本号和补丁构成。如OpenCV 3.4.5。

1.2定位OpenCV

可能由于各种原因,我们的系统上会安装了多版本,多位置的OpenCV。一般情况下不会影响使用,但当你需要指定特定的版本时,可以用下面这个命令定位存在在系统上的所有OpenCVConfig.cmake文件。

locate OpenCVConfig.cmake

但就算没有显示路径,好像也不能判断是否安装失败,学艺不精。
比如我是安装了opencv就没有显示,如图。
Ubuntu18.04下使用cmake编译一个OpenCV程序(编写CMakeLists.txt文件)_第1张图片

可以用如下命令确认是否安装成功

pkg-config opencv --modversion 

1.区分大小写
2.根据后缀名.cmake就知道这是Cmake的配置文件
3.这个路径一般不会用到,只会在指定特定openCV版本时中用到。在CMakeLists.txt里用下面这个命令。

find_package(OpenCV REQUIRED)
//自动指定,注意!区分大小写

2.创建一个项目

我们在项目文件夹下创建src,include,lib,build四个文件夹和CMakeLists.txt。注意,区分大小写

mkdir demo	//创建项目文件夹
cd demo && mkdir src include lib build && touch CMakeLists.txt	
//进入demo文件夹后创建4个文件夹和CMakeLists.txt文件

Ubuntu18.04下使用cmake编译一个OpenCV程序(编写CMakeLists.txt文件)_第2张图片

其实本次用到的只是一个简单的程序,可以不用这些细分文件夹。
1.src文件夹放.c/.cpp文件;
2.include文件夹放.h文件;
3.lib文件夹放库文件.a/.so;
4.build文件夹用于放cmake运行产生的多个文件,这个文件名可以是其他,如my_build。因为还没有cmake CMakeLists.txt,所以build文件夹下还没有任何文件。

3.编写一个基础OpenCV程序

cd src && gedit zzing.cpp
//进入src文件夹后创建并编辑zzing.cpp

写入如下代码

#include 
#include 
#include 
using namespace std;
using namespace cv;

int main() {
    Mat img = imread("../lena.jpeg");
    if (img.empty()) {
	cout <<"error,unable to open picture"<< endl;
	return -1;
    }    
	imshow("img", img);
	waitKey(0);    
    return 0;
}

保存后退出
代码大致的作用是把项目根目录下的lena.jpeg在一个窗口中展示,应该是OpenCV最基础的程序。可以自己找一张照片放在自己喜欢的路径,代码 imread("…/lena.jpeg")的" "内填入对应路径。
加入图片和zzing.cpp后目录树如图:
Ubuntu18.04下使用cmake编译一个OpenCV程序(编写CMakeLists.txt文件)_第3张图片

原本还想写一个在Jetson NX读取相机的程序,结果在咸鱼上买的树莓派csi相机读取不出来,也不知道是不兼容还是被坑了,郁闷。有知道怎么解决的朋友吗?

4.编写CMakeLists.txt文件

cd ../ && gedit CMakeLists.txt
// 返回上一级后编辑CMakeLists.txt

打开文件后写入如下命令

cmake_minimum_required(VERSION 2.8)	#声明cmake需要的最低版本
project(Demo)	#声明cmake项目的名称

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})	#添加OpenCV头文件
add_executable(${PROJECT_NAME} src/zzing.cpp)	#生成可执行文件,这里我把可执行文件名称定义成项目名称
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})	#链接OpenCV库文件到cmake项目上

cmake_minimum_required() 需要的最低cmake版本
project() 生成的项目名称

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
这两个命令指定编译类型为C++
如果是CMAKE_C_STANDARD则为C

find_package(OpenCV REQUIRED)
这个命令会在系统内寻找OpenCV的路径,找前文提到的OpenCVConfig.cmake,注意大小写。

${OpenCV_INCLUDE_DIRS}和 ${OpenCV_LIBS}分别是OpenCV的头文件和库文件包含路径,来自find_package(OpenCV REQUIRED)。
这里推荐一篇文章
CMakeLists.txt 语法介绍与实例演练

完成CMakeLists.txt编写后进行cmake

cd build
cmake ..	//注意是空格后..  是camke前面目录中的CMakeLists.txt
make -j8	//-j8和进程有关,可以是make/make -4/make -j6

出现图中红框代表生成成功
Ubuntu18.04下使用cmake编译一个OpenCV程序(编写CMakeLists.txt文件)_第4张图片
最后

./Demo

出现lena的图片窗口代表成功

你可能感兴趣的:(opencv,ubuntu,cmake)