0%

OpenCV 遗留物检测算法

简介

  • OpenCV 实现遗留物检测算法

OpenCV实现遗留物视觉检测算法


以下是使用OpenCV实现遗留物视觉检测的分步说明和代码示例,核心思路是通过背景建模、运动检测和物体驻留时间分析来识别静止的遗留物。


算法思路

  1. 背景建模:提取稳定的背景,分离运动的前景物体。
  2. 运动检测:检测视频中的移动物体并跟踪其位置。
  3. 驻留时间分析:记录物体在某一区域的停留时间,超过阈值则判定为遗留物。
  4. 报警与可视化:标注遗留物区域并触发警告。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <opencv2/opencv.hpp>
#include <vector>
#include <map>

using namespace cv;
using namespace std;

// 定义遗留物结构体:记录位置和驻留时间
struct StaticObject {
Rect2d bbox;
int stayFrames;
bool isWarning;
};

int main() {
// 初始化摄像头或视频文件
VideoCapture cap("test.mp4");
if (!cap.isOpened()) return -1;

// 创建背景减除器(MOG2算法)
Ptr<BackgroundSubtractor> bgSubtractor = createBackgroundSubtractorMOG2(500, 16, false);

Mat frame, fgMask, bgImg;
map<int, StaticObject> trackedObjects; // 跟踪的物体列表
int objectId = 0;

while (cap.read(frame)) {
// 背景建模更新
bgSubtractor->apply(frame, fgMask, 0.001);

// 形态学操作去噪
morphologyEx(fgMask, fgMask, MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(5,5)));
morphologyEx(fgMask, fgMask, MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(15,15)));

// 查找轮廓
vector<vector<Point>> contours;
findContours(fgMask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

// 过滤小面积噪声
vector<Rect> currentRects;
for (const auto& contour : contours) {
if (contourArea(contour) > 500) {
Rect rect = boundingRect(contour);
currentRects.push_back(rect);
}
}

// 物体跟踪与匹配(简单IOU匹配)
map<int, StaticObject> newTrackedObjects;
for (const auto& rect : currentRects) {
bool matched = false;
for (auto& obj : trackedObjects) {
Rect2d trackedRect = obj.second.bbox;
// 计算交并比(IOU)
double intersectionArea = (trackedRect & rect).area();
double unionArea = trackedRect.area() + rect.area() - intersectionArea;
if (intersectionArea / unionArea > 0.3) {
// 更新位置和驻留时间
obj.second.bbox = rect;
obj.second.stayFrames++;
newTrackedObjects[obj.first] = obj.second;
matched = true;
break;
}
}
if (!matched) {
// 新增物体
StaticObject newObj{rect, 1, false};
newTrackedObjects[objectId++] = newObj;
}
}
trackedObjects = newTrackedObjects;

// 检测遗留物(驻留超过阈值)
for (auto& obj : trackedObjects) {
if (obj.second.stayFrames > 100 && !obj.second.isWarning) { // 假设100帧为阈值
obj.second.isWarning = true;
rectangle(frame, obj.second.bbox, Scalar(0,0,255), 2);
putText(frame, "Warning: Static Object!", Point(10,30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0,0,255), 2);
} else if (obj.second.isWarning) {
rectangle(frame, obj.second.bbox, Scalar(0,0,255), 2);
}
}

// 显示结果
imshow("Frame", frame);
imshow("Foreground Mask", fgMask);
if (waitKey(30) == 27) break;
}

cap.release();
destroyAllWindows();
return 0;
}

关键步骤解析

  1. 背景建模

    • 使用createBackgroundSubtractorMOG2创建背景模型,动态更新背景。
    • apply方法生成前景掩模(fgMask)。
  2. 形态学去噪

    • 开运算(MORPH_OPEN)消除小噪声。
    • 闭运算(MORPH_CLOSE)填充物体内部空洞。
  3. 轮廓检测与过滤

    • findContours提取前景物体轮廓。
    • 过滤面积过小的噪声区域(如contourArea > 500)。
  4. 物体跟踪

    • 使用简单的交并比(IOU)匹配新旧物体位置。
    • 更新物体的驻留时间(stayFrames)。
  5. 遗留物判定

    • 驻留时间超过阈值(如100帧)时触发报警。
    • 用红色框标注遗留物,并显示警告文本。

优化方向

  1. 更精准的跟踪算法

    • 使用卡尔曼滤波(cv::KalmanFilter)或光流法(cv::calcOpticalFlowPyrLK)优化物体跟踪。
  2. 减少误检

    • 结合颜色、纹理特征过滤临时静止物体(如短暂停留的行人)。
    • 使用深度学习模型(YOLO等)分类物体是否为可疑遗留物。
  3. 多摄像头协同

    • 多视角联合分析,解决遮挡问题。
  4. 实时性优化

    • 使用UMat加速计算(OpenCL)。
    • 多线程处理视频帧。

效果示意图

输入帧 前景掩模 遗留物检测结果
输入帧 前景掩模 结果

通过此方案,可实现对视频中静止遗留物体的实时检测。实际部署时需根据场景调整参数(如驻留时间阈值、形态学核大小等)。

感谢老板支持!敬礼(^^ゞ