opencv 的运动目标检测c++
时间: 2023-05-24 12:02:51 浏览: 276
A:OpenCV提供了几种运动目标检测的方法,其中最常用的是基于背景减除的方法。具体步骤如下:
1. 读取视频,初始化背景模型。
2. 对每一帧进行前景检测,一般使用差分法。
3. 对于前景像素,采用形态学处理提取连通区域。
4. 对于每个连通区域,计算其质心与外接矩形,作为目标的中心点和BoundingBox。可以使用cv::moments()和cv::boundingRect()函数实现。
5. 可以加入目标过滤和跟踪等后续处理。
下面是一个简单的示例代码:
```
#include <opencv2/opencv.hpp>
int main()
{
cv::VideoCapture cap("test.mp4");
cv::Ptr<cv::BackgroundSubtractor> pMOG2 = cv::createBackgroundSubtractorMOG2();
while (true) {
cv::Mat frame;
cap >> frame;
if (frame.empty()) {
break;
}
cv::Mat fgMask;
pMOG2->apply(frame, fgMask);
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));
cv::morphologyEx(fgMask, fgMask, cv::MORPH_OPEN, kernel);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(fgMask, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
cv::Moments moments = cv::moments(contours[i], true);
cv::Point center(moments.m10 / moments.m00, moments.m01 / moments.m00);
cv::Rect bbox = cv::boundingRect(contours[i]);
cv::rectangle(frame, bbox, cv::Scalar(0, 0, 255), 2);
cv::circle(frame, center, 4, cv::Scalar(0, 255, 0), -1);
}
cv::imshow("frame", frame);
cv::imshow("fgMask", fgMask);
char key = cv::waitKey(30);
if (key == 27) {
break;
}
}
cap.release();
cv::destroyAllWindows();
return 0;
}
```
其中,cv::BackgroundSubtractor是背景减除的基类,cv::BackgroundSubtractorMOG2是一种改进的高斯混合模型方法,使用较为广泛。cv::findContours()函数可以用来提取轮廓。
阅读全文