【opencv】示例-phase_corr.cpp 捕获视频流并通过计算相位相关性来检测画面中的移动...

news/2024/9/24 15:18:05/

390d5323b2c3c190c9334049dc6d501b.png

// 包含OpenCV库的头文件
#include "opencv2/core.hpp" // 包含OpenCV核心功能
#include "opencv2/videoio.hpp" // 包含视频IO功能
#include "opencv2/highgui.hpp" // 包含高级GUI功能,显示图像
#include "opencv2/imgproc.hpp" // 包含图像处理功能using namespace cv; // 使用OpenCV命名空间,方便调用OpenCV函数int main(int, char* [])
{VideoCapture video(0); // 创建VideoCapture对象,用于捕获编号为0的摄像头视频// 定义一些Mat类型的变量用于存放处理的帧Mat frame, curr, prev, curr64f, prev64f, hann;char key; // 用于接收用户按键// 主循环do{video >> frame; // 从视频流中读取一帧保存到frame变量中cvtColor(frame, curr, COLOR_RGB2GRAY); // 将捕获的彩色帧转换为灰度图// 如果prev为空,说明是第一帧,需要进行初始化if(prev.empty()){prev = curr.clone(); // 将当前帧存储到prev中,用于下次迭代createHanningWindow(hann, curr.size(), CV_64F); // 创建汉宁窗,用于相位相关函数}// 将prev和curr的数据类型转换为CV_64F,用于相位相关函数prev.convertTo(prev64f, CV_64F);curr.convertTo(curr64f, CV_64F);// 计算prev和curr之间的相位偏移Point2d shift = phaseCorrelate(prev64f, curr64f, hann);double radius = std::sqrt(shift.x*shift.x + shift.y*shift.y); // 计算偏移的幅度// 如果偏移幅度大于5,绘制一个圆和线来表示偏移方向if(radius > 5){Point center(curr.cols >> 1, curr.rows >> 1); // 计算帧的中心点// 在当前帧上绘制圆和线circle(frame, center, (int)radius, Scalar(0, 255, 0), 3, LINE_AA);line(frame, center, Point(center.x + (int)shift.x, center.y + (int)shift.y), Scalar(0, 255, 0), 3, LINE_AA);}imshow("phase shift", frame); // 显示经过相位相关偏移标示的图像key = (char)waitKey(2); // 等待2ms,如果有按键则获取到key变量prev = curr.clone(); // 更新prev帧为当前帧} while(key != 27); // 如果按键不是Esc键继续循环,Esc键ASCII码为27,用于退出循环return 0; // 程序结束,返回0
}
createHanningWindow(hann, curr.size(), CV_64F);

035ab5113fe059a98079f265dda4a94a.png

Point2d shift = phaseCorrelate(prev64f, curr64f, hann)

f2d9c59def6e2bf011408480a08a67b6.png


http://www.ppmy.cn/news/1424917.html

相关文章

SpringBoot整合Nacos

文章目录 nacosnacos下载nacos启动nacos相关配置demo-dev.yamldemo-test.yamluser.yaml 代码pom.xmlUserConfigBeanAutoRefreshConfigExampleValueAnnotationExampleDemoApplicationbootstrap.yml测试结果补充.刷新静态配置 nacos nacos下载 下载地址 一键傻瓜试安装即可,官…

js如何設置滾動到元素位置

在JavaScript中,你可以使用window.scrollTo()方法或元素的scrollIntoView()方法来设置滚动位置。这些方法允许你将页面滚动到特定的坐标或元素。 使用 window.scrollTo() window.scrollTo() 方法接受两个参数:x坐标和y坐标,分别代表水平滚动…

chromedriver最新版下载地址

地址1.百度网盘 链接(提取码:2vo3):百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

学习前端第二十二天(Switch语句,函数)

一、Switch语句 switch 语句可以替代多个 if 判断 switch 语句有至少一个 case 代码块和一个可选的 default 代码块。 switch(x) { case value1: // if (x value1) ... [break] case value2: // if (x value2) ... [break] default: ... [break] } 比较 x 值与第一个 cas…

ubuntu23.10.1 php8.2安装

1、更新镜像源 apt update2、安装php apt install php php-fpm php-mysql其他扩展包,在后面加个-可以查看,选择安装,我这里是php8.2版本 apt-get install php8.2- 2.1php与nginx结合 PHP-FPM的配置文件位于/etc/php/{PHP版本}/fpm/pool.d/www.conf;…

[C++] C++基础之inline的使用

文章目录 1. 为什么要使用inline2. inline如何减少调用开销的,与宏有什么区别2.1 inline如何工作的?2.2 与宏的区别? 3. 那么inline会强制有效吗?4. 在函数声明前使用inline有效吗?5. 绝对不会inline的函数有哪些&…

系统架构最佳实践 -- 统一身份认证系统

目录 1.系统架构设计: 2.用户认证与授权: 3.用户身份管理: 4.安全性保障: 5.日志记录与审计: 6.高可用性与容错性: 7.用户体验优化: 随着互联网的快速发展和应用的普及,人们在…

4.1 返回JSON数据

1. 默认实现方式 JSON是目前主流的前后端数据传输方式,Spring MVC中使用消息转换器HttpMessageConverter对JSON的转换提供了很好的支持,在Spring Boot中更进一步,对相关配置做了更进一步的简化。 默认情况下,当开发者新创建一个S…