《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使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核