我是靠谱客的博主 畅快樱桃,这篇文章主要介绍opencv-视频图像的前景动态追踪,现在分享给大家,希望可以做个参考。

  • opencv2的前景分割方法主要是高斯混合背景/前景分割方法,而3.0版本才增加了knn前背景分割器。
  • 高斯混合背景/前景分割方法可以通过两个类BackgroundSubtractorMOG 和BackgroundSubtractorMOG 2实现,测试后发现BackgroundSubtractorMOG 2的实现效果要好。
  • 关于这个构建这个类相关的参数说明参见博客:http://blog.csdn.net/xiaowei_cqu/article/details/23689189
  • 下面我一个bgSubtractor类,然后在此类中实现一个public方法:videoStractorByMog2(VideoCapture& video),使得输入是一个要处理的视频,输出是分割后前背景二值化视频和以及前景的最大外接矩形视频。

  • 算法效果如下:
  • 输入:
    这里写图片描述
  • 输出:
    这里写图片描述

  • 实例代码
复制代码
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
#ifndef BGSUBTRACTOR_H_ #define BGSUBTRACTOR_H_ #include"ordImgProcLib.h" class bgSubtractor{ private: public: void videoStractorByMog2(VideoCapture& video){ Mat frame; Mat fMask;//前景mask Mat th;//二值化图像 double rate = video.get(CV_CAP_PROP_FPS); int delay = 1000 / rate; BackgroundSubtractorMOG2 bgMog2(20, 30, true); bool stop(false); while (!stop){ if (! video.read(frame)){ break; } // press any key to stop if (waitKey(delay) >= 0) stop = true; bgMog2(frame, fMask, 0.01); //前景区域二值化,将非白色(0 - 245)的非前景区域(包含背景以及阴影)均设为0,前景的白色(245 - 255)设置为255 threshold(fMask, th, 245, 255, THRESH_BINARY); //二值化形态学处理 //寻找外轮廓 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(th, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); //寻找外轮廓的最大外截矩形 vector<vector<Point>>::const_iterator itContours = contours.begin(); for (int c=0; itContours != contours.end(); ++itContours){ if (itContours->size() >= 100){ Rect r = boundingRect(contours[c]); rectangle(frame, r, Scalar(0,255,0), 2); } c++; } imshow("fmask", fMask); imshow("frame", frame); } video.release(); } }; #endif

最后

以上就是畅快樱桃最近收集整理的关于opencv-视频图像的前景动态追踪的全部内容,更多相关opencv-视频图像内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部