《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

相关文章

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结