为了记录以及防止遗忘,备份一个大致能满足运行的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就没有显示,如图。
可以用如下命令确认是否安装成功
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文件
其实本次用到的只是一个简单的程序,可以不用这些细分文件夹。
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 <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
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后目录树如图:
原本还想写一个在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
出现图中红框代表生成成功
最后
./Demo
出现lena的图片窗口代表成功