基于c++ opencv4.6做三帧间差法检测物体
时间: 2023-07-15 11:13:46 浏览: 140
基于C++的三帧差法
三帧间差法是一种基于视频帧之间的差异来检测运动物体的方法。具体实现方法如下:
1. 读取视频流,并将前两帧分别存储在img1和img2中。
2. 将img1和img2转换为灰度图像,可以使用cv::cvtColor函数。
3. 将img1和img2进行差分,得到一张差分图像diff。
```
cv::absdiff(img1, img2, diff);
```
4. 读取下一帧图像,并将其转换为灰度图像。
5. 将img2和当前帧进行差分,得到一张差分图像diff2。
```
cv::Mat img3;
cap >> img3;
cv::Mat gray3;
cv::cvtColor(img3, gray3, cv::COLOR_BGR2GRAY);
cv::Mat diff2;
cv::absdiff(img2, gray3, diff2);
```
6. 将diff和diff2进行二值化处理,得到两张二值化图像。
```
cv::Mat thresholded;
cv::threshold(diff, thresholded, 50, 255, cv::THRESH_BINARY);
cv::Mat thresholded2;
cv::threshold(diff2, thresholded2, 50, 255, cv::THRESH_BINARY);
```
7. 对两张二值化图像进行逻辑与操作,得到一张包含运动目标的二值化图像。
```
cv::Mat motion;
cv::bitwise_and(thresholded, thresholded2, motion);
```
8. 对二值化图像进行形态学操作,可以使用cv::erode和cv::dilate函数,以去除噪声和填补空洞。
9. 使用cv::findContours函数寻找轮廓,并对轮廓进行进一步处理,例如计算其面积、周长等。
```
std::vector<std::vector<cv::Point>> contours;
cv::findContours(motion, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (const auto& contour : contours) {
double area = cv::contourArea(contour);
double perimeter = cv::arcLength(contour, true);
// 进一步处理轮廓
}
```
以上就是基于c++ opencv4.6实现三帧间差法检测物体的大致流程。
阅读全文