如有问题请联系:clr_mv@163.com
更多文章请关注微信公众号:机器视觉专业论坛
本文主要学习了视频图像的北京分割,采用的方法为MOG2,KNN两种方法。
该方法分割物体具有一定的鲁棒性,因此该方法可以作为一定鲁棒性的车流量检测。
#include "opencv2/core.hpp"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;
//this is a sample for foreground detection functions
int main(int argc, const char** argv)
{
namedWindow("image", WINDOW_NORMAL);
namedWindow("foreground mask", WINDOW_NORMAL);
namedWindow("foreground image", WINDOW_NORMAL);
namedWindow("mean background image", WINDOW_NORMAL);
//背景分割模型初始化
Ptr<BackgroundSubtractor> bg_model = createBackgroundSubtractorKNN().dynamicCast<BackgroundSubtractor>();
//createBackgroundSubtractorKNN().dynamicCast<BackgroundSubtractor>() ;
//createBackgroundSubtractorMOG2().dynamicCast<BackgroundSubtractor>();
Mat img0, img, fgmask, fgimg;
string file;
file = "G:\\OpencvStudy\\Test3\\data\\xing\\init.png";
for (int i = 0; i < 586; i++)
{
//读取图像序列,png格式
string s;
char t[256];
sprintf_s(t, "%03d", i);
s = t;//int 转化为String
file = "G:\\OpencvStudy\\Test3\\data\\xing\\xing" + s + ".png";
img0 = cv::imread(file);
if (img0.empty())
break;
//小窗显示结果
resize(img0, img, Size(640, 640 * img0.rows / img0.cols), INTER_LINEAR);
if (fgimg.empty())
fgimg.create(img.size(), img.type());
//更新模型
bg_model->apply(img, fgmask, 0);
fgimg = Scalar::all(0);
img.copyTo(fgimg, fgmask);
//获得背景图像
Mat bgimg;
bg_model->getBackgroundImage(bgimg);
imshow("image", img);
imshow("foreground mask", fgmask);
imshow("foreground image", fgimg);
if (!bgimg.empty())
imshow("mean background image", bgimg);
char k = (char)waitKey(30);
if (k == 27) break;
waitKey(5);//每隔5毫秒再读下一幅图像
}
return 0;
}