PS: 环境Ubuntu 20.04
, C++11
, OpenCV 4.5.1 (2020-12-22)
, OpenCV版本不同,API可能会有区别
1 安装OpenCV
2 OpenCV 图像初步
3 OpenCV 像素操作
4 OpenCV 图像处理
5 OpenCV 特征检测与匹配
6 OpenCV xml和yaml读写
7 OpenCV 目标检测
8 OpenCV 相机视觉
9 OpenCV 视频分析
10 OpenCV 机器学习和深度学习
CMakeLists.txt
模板
- 源码 .c 或 .cpp 放入 src 文件夹
- 自定义头文件 .h 或.hpp 放入 include
- cmake构建后会生成 bin 文件夹, 用于存放生成的二进制文件
# 设置用于构建该项目的最低cmake版本
cmake_minimum_required(VERSION 3.1)
# 设置项目名称和编程语言
project(opencv_demo CXX)
# 寻找opencv的头文件和库文件
find_package(OpenCV REQUIRED)
# opencv头文件路径
include_directories(${OpenCV_INCLUDE_DIRS})
# opencv库路径
link_directories(${OpenCV_LIBRARY_DIRS})
# 自定义头文件路径
include_directories(include)
# 设置二进制文件生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 获取源码的路径
aux_source_directory(src src)
# 设置编译标准和额外参数
add_compile_options(-std=c++20 -Wall -Werror -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-default -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -Wno-pedantic-ms-format)
# 从源码构建二进制文件
add_executable(demo ${src})
# 链接opencv库到二进制文件
target_link_libraries(demo ${OpenCV_LIBRARIES})
有时候需要移动程序到没有安装OpenCV的计算机上运行,则需要打包依赖的的而目标计算机上可能没有的库,可以使用下面的命令
ldd [二进制文件] | awk '{print $3}' | xargs -i cp -L {} [目标路径]
[二进制文件]
替换为实际生成的可执行文件名
[目标路径]
替换为用于存放拷贝的动态库的路径
而程序执行一般默认搜索的动态库路径有 /usr/lib
, /lib
, .
等等, 我自己写的一般就拷贝到二进制文件所在的路径,即 .
官网是个好东西, 安装教程,开发文档,示例源码… …样样齐全,是个学习的好地方.另外我列举一些可能用到的入口:
- 官方开发文档 (标准参考资料,可以根据使用的OpenCV版本查询对应的文档)
- CVUI (完全基于OpenCV的简单UI库,非OpenCV官方出品)
- opencv (OpenCV核心库)
- opencv_contrib (OpenCV扩展库, 有专利的算法,或者新加的功能,还不够稳定)
- opencv_extra (运行测试和一些示例程序需要用到的数据和脚本等)
- FUN computer vision opencv C++ tutorials (一个可以学习OpenCV的博客)
程序性能测量
// 返回值为从计算机启动到调用该函数时的时钟周期数
int64 cv::getTickCount();
// 返回值为时钟周期频率
cv::getTickFrequency();
// 示例模板
int main()
{
int64 e1 = cv::getTickCount();
// // // // // // // // // // // 中间为程序功能的实现代码
// // // // // // // // // // //
int64 e2 = cv::getTickCount();
// 输出程序运行耗时
std::cout << (double)(e2 - e1) / cv::getTickFrequency();
}
// 计算
或者也可以使用Linux的time命令计时
time [要执行的程序路径]
第一行是程序中输出的,后面的是time命令统计的(看real就行). 两者有偏差也正常, time计算的是整个程序执行的耗时,而程序内输出的肯定无法做到,就要小一点.