Cmake编译c++程序,调用了opencv以及运行程序
最近接触了因项目需要开始接触ARM,需要用cmake编译c++程序调用摄像头,因为以前没有用过arm环境及cmake编译所以走了不少弯路,在此结合过程中查找的资料记录一下遇到的问题及解决方法。
当在linux系统下编写程序时,因为没有windows下类似于vs code的那种集成开发环境。所以不能想windows下一样一键编译运行。
一种方法是编写makefile文件,用它管理程序脚本之间的依赖关系。但是这个方法比较麻烦。目前常用的方法是利用cmake工具生成makefile文件。
想要使用cmake文件需要在工程的每个文件夹中都编写CMakeLists.txt文件。
首先建立一个名为camera的文件夹,在其中建立程序源文件main.cpp和CMakeLists.txt这里由于要调用摄像头,因此需要链接opencv
#main.cpp
#include<opencv2/opencv.hpp>
using namespace cv;
int main(){
VideoCapture cap;
cap.open(1); //打开摄像头,序列号是/dev/videoi,i是0,1,2,cap.open(i)
if(!cap.isOpened())
return -1;
Mat frame;
while(1)
{
cap>>frame;//等价于cap.read(frame);
//Canny(frame, frame, 30, 100);//canny边缘检测,去掉这一行就是纯粹的读取摄像头了
//cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错
if(frame.empty())
break;
imshow("video", frame);
if(waitKey(20)>0)//按下任意键退出摄像头 因电脑环境而异,有的电脑可能会出现一闪而过的情况
break;
}
cap.release();
destroyAllWindows();//关闭所有窗口
return 0;
}
# CMakeLists.txt
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程 工程名为 pro
project( pro )
# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )
#添加OPENCV库
#指定OpenCV版本,代码如下
#find_package(OpenCV 3.3 REQUIRED)
#如果不需要指定OpenCV版本,代码如下
find_package(OpenCV REQUIRED)
#添加OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})
#显示OpenCV_INCLUDE_DIRS的值
message(${OpenCV_INCLUDE_DIRS})
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( camera main.cpp )
# 将库文件链接到可执行程序上
# 生成名为lesson2的可执行程序
target_link_libraries( camera ${OpenCV_LIBS})
CMakeLists.txt代码部分解释:
find_package(OpenCV REQUIRED)会在Ubuntu系统下找到OpenCVConfig.cmake,该文件定义了OpenCV_INCLUDE_DIRS
和OpenCV_LIBS
等变量,因而可以使用include_directories
和target_link_libraries
来访问这两个变量
可以通过terminal输入locate OpenCVConfig.cmake来找到这个.cmake文件,用以确认系统确实安装了OpenCV
然后在terminal下,将路径改为当前文件夹,先后执行
$cmake .
$make
在此时的文件夹中生成camera文件,camera文件时编译之后的输出文件
$./camera
可以看到输出结果
在运行之后发现图像角度不对,因此调用
transpose();
flip();
旋转摄像头
使用方法:
flip(mat, mat, int)
第三个参数:1 左右翻
0上下翻
-1对角翻
通过使用flip可以达到旋转90°,180°,270°的效果
transpose()是转置,效果是翻转+右旋90°