《OpenCV2 计算机视觉编程手册》视频处理二

2024-04-07 06:38

本文主要是介绍《OpenCV2 计算机视觉编程手册》视频处理二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文结合上文《OpenCV2 计算机视觉编码手册》视频处理一的基础上,添加视频跟踪类,来对视频中运动对象进行跟踪。


1. 添加特征跟踪类

#ifndef FTRACKER
#define FTRACKER#include "head.h"
#include "videoprocessor.h"
#include <opencv2/video/tracking.hpp>
#include <opencv2/features2d/features2d.hpp>class FeatureTracker : public FrameProcessor 
{	
private:cv::Mat gray;			            // 当前灰度图像cv::Mat gray_prev;		            // 前一个灰度图像std::vector<cv::Point2f> points[2]; // 两幅图像跟踪特征 0->1std::vector<cv::Point2f> initial;   // 跟踪点的初始化std::vector<cv::Point2f> features;  // 检测到的特征int max_count;	                    // 需要跟踪的最大特征数目double qlevel;                      // 特征检测中的质量等级double minDist;                     // 两特征点之间的最小距离std::vector<uchar> status;          // 跟踪的特征状态std::vector<float> err;             // 跟踪错误public:// 构造函数FeatureTracker() : max_count(500), qlevel(0.01), minDist(10.) {}// 处理方法void process(cv:: Mat &frame, cv:: Mat &output) {cv::cvtColor(frame, gray, CV_BGR2GRAY);  // 转换为灰度图像frame.copyTo(output);// 1. 如果需要添加新的特征点if(addNewPoints()){detectFeaturePoints();                                            // 检测特征点points[0].insert(points[0].end(),features.begin(),features.end());// 添加检测的特征到当前跟踪的特征initial.insert(initial.end(),features.begin(),features.end());}// 对应视频序列中的第一幅图像if(gray_prev.empty())gray.copyTo(gray_prev);// 2.跟踪特征cv::calcOpticalFlowPyrLK(gray_prev, gray, // 两幅连续图像points[0],                            // 图1中的输入点坐标points[1],                            // 图2中的输出点坐标status,                               // 跟踪成功err);                                 // 跟踪失败// 2. 遍历所有跟踪点进行筛选int k=0;for( int i= 0; i < points[1].size(); i++ ) {// 是否需要保留该跟踪点?if (acceptTrackedPoint(i)) {// 保留该跟踪点到vectorinitial[k]= initial[i];points[1][k++] = points[1][i];}}// 去除不成功点points[1].resize(k);initial.resize(k);// 3. 处理接受的跟踪点handleTrackedPoints(frame, output);// 4. 当前的点和图像变为它之前的点和图像std::swap(points[1], points[0]);cv::swap(gray_prev, gray);}// 特征点检测void detectFeaturePoints() {	// 检测特征cv::goodFeaturesToTrack(gray, // 图像features,   // 检测到的特征max_count,  // 特征的最大数目qlevel,     // 质量等级minDist);   // 两个特征之间的最小距离}// 决定是否添加新点bool addNewPoints(){// 如果点的数量太少return points[0].size()<=10;}// 决定哪些点应该跟踪bool acceptTrackedPoint(int i){return status[i] &&// 如果它移动了(abs(points[0][i].x-points[1][i].x)+(abs(points[0][i].y-points[1][i].y))>2);}// 处理当前跟踪点void handleTrackedPoints(cv:: Mat &frame, cv:: Mat &output) {// 遍历所有跟踪点for(int i= 0; i < points[1].size(); i++ ) {// 绘制直线和圆cv::line(output, initial[i],            // 初始位置points[1][i],          // 新位置cv::Scalar(255,255,255)// 白色);cv::circle(output,          // 输出图像points[1][i],           // 圆心3,                      // 半径cv::Scalar(255,255,255),// 白色-1                      // 负数表示填充圆圈, 整数表示线条厚度);}}
};#endif

2. main函数

#include "featuretracker.h"int main()
{VideoProcessor processor;                           // 创建一个视频处理实例FeatureTracker tracker;                             // 创建一个特征跟踪实例processor.setInput("../bike.avi");                  // 打开视频文件processor.setFrameProcessor(&tracker);              // 设置帧处理器为一个特征跟踪实例trackerprocessor.displayOutput("Tracked Features");        // 声明跟踪特征显示窗口processor.setDelay(1000./processor.getFrameRate()); // 设置视频播放帧率为原始帧率processor.run();                                    // 开始处理cv::waitKey();                                      // 等待按键响应return 0;
}










这篇关于《OpenCV2 计算机视觉编程手册》视频处理二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881890

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返