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

cpp 复制代码
// 包含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
}
css 复制代码
createHanningWindow(hann, curr.size(), CV_64F);
bash 复制代码
Point2d shift = phaseCorrelate(prev64f, curr64f, hann)
相关推荐
“AI国潮设计-小江”5 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞草莓抱抱卷蛋糕”IP插牌立牌方案,锁定角色一致性,甜品插件化落地》
开发语言·人工智能·python·prompt·aigc
Ivanqhz6 分钟前
超参数考量与设计
数据库·人工智能·深度学习·算法·机器学习
AI小百科8 分钟前
模型微调是什么?企业怎么用好它
人工智能
硅谷秋水11 分钟前
VLMeg:把 VLM 从奖励回归器变成成功检测器
人工智能·机器学习·语言模型·数据挖掘·机器人
IT智慧客073111 分钟前
什么人适合做 OPC,又该怎么开始?
人工智能
Data_AI4Science12 分钟前
AI 时代,人更重要了
人工智能·ai·智能体·生物医药·电子实验记录本·ai取代人
企业数字化笔记14 分钟前
AI视频成片怎样做到可追溯?用镜头清单、文件哈希和字幕时间轴复盘交付
人工智能·音视频·哈希算法
霍格沃兹测试学院-小舟畅学18 分钟前
Playwright CLI:语义快照与局部检索,AI 如何找到正确的页面元素?
人工智能·microsoft
jay神18 分钟前
基于 YOLOv8 的垃圾分类识别系统
人工智能·深度学习·yolo·机器学习·目标跟踪·分类·计算机毕业设计
搞科研的小刘选手19 分钟前
【SPIE出版 | Fellow主讲 | 黄河科技学院主办 | 中国·郑州】2026年人工智能与表示学习国际学术会议(AIRL 2026)
人工智能·学术会议·表示学习·会议推荐·郑州