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

此篇文章是学习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);

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值