// 包含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);
Point2d shift = phaseCorrelate(prev64f, curr64f, hann)