opencv4.6 c++ 使用三帧间差法 的实现
时间: 2024-02-22 18:56:40 浏览: 114
opencv实现三帧差法解析
三帧间差法是一种基于像素差异的运动检测算法,可以用于检测视频中物体的运动。下面是使用OpenCV 4.6和C++实现三帧间差法的代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 打开视频文件
VideoCapture cap("video.mp4");
// 如果视频文件无法打开,输出错误信息并退出程序
if (!cap.isOpened()) {
cout << "Error opening video file" << endl;
return -1;
}
// 读取前三帧图像
Mat frame1, frame2, frame3;
cap >> frame1;
cap >> frame2;
cap >> frame3;
// 定义中间图像和输出图像
Mat diff1, diff2, motion;
// 设置阈值和膨胀操作的核大小
int threshold_value = 30;
int dilation_size = 10;
// 循环处理每一帧图像
while (true) {
// 将前三帧图像转换为灰度图像
Mat gray1, gray2, gray3;
cvtColor(frame1, gray1, COLOR_BGR2GRAY);
cvtColor(frame2, gray2, COLOR_BGR2GRAY);
cvtColor(frame3, gray3, COLOR_BGR2GRAY);
// 计算相邻两帧图像之间的差异
absdiff(gray1, gray2, diff1);
absdiff(gray2, gray3, diff2);
// 将两帧差异图像取平均
bitwise_and(diff1, diff2, motion);
threshold(motion, motion, threshold_value, 255, THRESH_BINARY);
// 对运动图像进行膨胀操作
Mat element = getStructuringElement(MORPH_RECT, Size(dilation_size, dilation_size));
dilate(motion, motion, element);
// 显示运动图像
imshow("Motion", motion);
// 读取下一帧图像
frame1 = frame2.clone();
frame2 = frame3.clone();
cap >> frame3;
// 如果视频已经播放完毕,跳出循环
if (frame3.empty()) {
break;
}
// 等待一段时间,按下ESC键退出程序
if (waitKey(30) == 27) {
break;
}
}
return 0;
}
```
说明:
1. 首先打开视频文件,并读取前三帧图像`frame1`、`frame2`和`frame3`。
2. 然后定义中间图像`diff1`、`diff2`和输出图像`motion`。
3. 接下来设置运动检测的阈值`threshold_value`和膨胀操作的核大小`dilation_size`。
4. 循环处理每一帧图像,将前三帧图像转换为灰度图像,计算相邻两帧图像之间的差异,取两帧差异图像的平均,进行二值化处理和膨胀操作,最后可视化运动图像。
需要注意的是,三帧间差法的实现较为简单,但对于光照变化和噪声等因素的干扰较为敏感,容易出现误检和漏检的情况。
阅读全文