opencv 高斯混合模型BackgroundSubtractorMOG2实现目标跟踪

来源:互联网 发布:淘宝详情页打不开 编辑:程序博客网 时间:2024/05/22 03:17
此篇文章是学习csdn学院的个教程视频中的例子,于是跟着视频自己也学着实现了。先得准备一些基本的图像操作知识。

基本的一些图像操作

主要为图像的缩放、高斯模糊、颜色空间转化、二值化

#include <opencv2/core/core.hpp>  #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>#include <opencv2/video/background_segm.hpp>#include <iostream>using namespace cv;using namespace std;void find_move_people();int main(void){    char *f = "E:\\opencv\\opencv\\sources\\samples\\wp8\\OpenCVXaml\\OpenCVXaml\\Assets\\Lena.png";    Mat lena,lena2,gasLena,lenaColor,lenaBinary;    lena = imread(f);    //图片调整为原来的四分之一。4、5参数是在x和y上的缩放,默认为0,最后通常也是INTER_LINEAR    resize(lena, lena2, Size(lena.cols / 2, lena.rows / 2), 0.5, 15 , cv::INTER_LINEAR);    // 高斯模糊,第三个为平滑窗口的size , 4、5为在水平和竖直方向的平滑系数namuda值,最后一个也通常使用默认值    GaussianBlur(lena, gasLena, Size(9, 9), 6, 6, 0);    // 转换颜色空间,可以转化为yuv,下面是转化为灰度图    cvtColor(lena, lenaColor, CV_BGR2GRAY);    //二值化。3为阈值,4为大于阈值的像素灰度值,5为二值化类型    threshold(lenaColor, lenaBinary, 145, 225, THRESH_BINARY);    imshow("lena", lena);    imshow("lena2", lena2);    imshow("lena3", gasLena);    imshow("lena4", lenaColor);    imshow("lena5", lenaBinary);    waitKey(0); }

执行的结果相信大家见过很多次,也就不列举出来了。

目标跟踪

目标视频为opencv的sample内的视频,利用高斯混合模型来实现目标跟踪:
void find_move_people(){    char *video_path = "E:\\opencv\\opencv\\sources\\samples\\data\\vtest.avi";    VideoCapture capture;    Mat frame, image, foreGround, backGround, fgMask;//  Ptr<BackgroundSubtractor> pBgmodel = createBackgroundSubtractorMOG2().dynamicCast<BackgroundSubtractor>();    Ptr<BackgroundSubtractorMOG2> pBgmodel = createBackgroundSubtractorMOG2();    pBgmodel->setVarThreshold(20);    capture.open(video_path);    if (!capture.isOpened())    {        cout << "open videp eror!" << endl;    }    while (true)    {        //frame是原始帧        capture >> frame;        if (frame.empty())            break;        //缩小为原来四分之一,加快处理速度        resize(frame, image, Size(frame.cols / 2, frame.rows / 2), INTER_LINEAR);        if (foreGround.empty())            foreGround.create(image.size() , image.type());        //得到前景图像,是黑白灰 3种灰度值的图        pBgmodel->apply(image, fgMask);        // 下面是根据前景图的操作,和原图像融合得到有纹理的前景图        GaussianBlur(fgMask, fgMask, Size(5, 5) , 0);        threshold(fgMask , fgMask, 10, 255, THRESH_BINARY);        // 将foreGraound 所有像素置为0        foreGround = Scalar::all(0);        //fgMask对应点像素值为255则 foreGround像素为image里的像素,为0则直接为0        image.copyTo(foreGround, fgMask);        pBgmodel->getBackgroundImage(backGround);        imshow("frame", frame);        imshow("backGround", backGround);        //imshow("foreGround", foreGround);        imshow("fgMask", fgMask);        char key = waitKey(100);        if (key == 27)//27 对应得assic 码是27            break;    }}

执行结果如下:
这里写图片描述

注意:opencv 3.0 后版本没有了BackgroundSubtractorMOG

更多设置参数及注释参考如下:

// 背景模型影响帧数 默认为500
mod->setHistory(1000);
// 模型匹配阈值
mod->setVarThreshold(50);
// 阴影阈值
mod->setShadowThreshold(0.7);
// 前景中模型参数,设置为0表示背景,255为前景,默认值127
mod->setShadowValue(127);
// 背景阈值设定 backgroundRatio*history
mod->setBackgroundRatio(2);
// 设置阈值的降低的复杂性
mod->setComplexityReductionThreshold(0.02);
// 高斯混合模型组件数量
mod->setNMixtures(100);
// 设置每个高斯组件的初始方差
mod->setVarInit(0.5);
// 新模型匹配阈值
mod->setVarThresholdGen(9);

阅读全文
0 0