OpenCV使用BSM统计视频中移动的对象

 更新时间:2023年02月21日 09:41:13   作者:音视频开发老舅  
这篇文章主要为大家详细介绍了OpenCV如何使用BackgroundSubstractor(BSM)实现视频中移动对象统计功能,文中的示例代码讲解详细,需要的可以参考一下

1、概述

案例:使用BackgroundSubstractor实现视频中移动对象统计

实现步骤:

1.实例化VideoCapture

2.创建BackgroundSubstractor

3.while循环读取视频帧

4.使用BS->apply获取mask

5.对mask进行二值化及形态学操作

6.使用findContours执行轮廓发现

7.统计最大外接矩形

8.输出结果

ps:这个算法的抗干扰能力比较差,要相出正确的结果,必须要对frame进行预处理。或者提升视频的质量才行。不然只能得到一个错误的结果

2、代码示例

Move_Video_Object_Tracking::Move_Video_Object_Tracking(QWidget *parent)
    : MyGraphicsView{parent}
{
    this->setWindowTitle("视频中移动对象统计");
    QPushButton *btn = new QPushButton(this);
    btn->setText("选择视频");
    connect(btn,&QPushButton::clicked,[=](){
        choiceVideo();
    });
 
}
 
 
void Move_Video_Object_Tracking::choiceVideo(){
    path = QFileDialog::getOpenFileName(this,"请选择视频","/Users/yangwei/Downloads/",tr("Image Files(*.mp4 *.avi)"));
    qDebug()<<"视频路径:"<<path;
    showMoveVideoObjectTracking(path.toStdString().c_str());
}
 
void Move_Video_Object_Tracking::showMoveVideoObjectTracking(const char* filePath){
    VideoCapture capture;
    capture.open(filePath);
 
    if(!capture.isOpened()){
        qDebug()<<"无法加载视频文件";
        return;
    }
    Ptr<BackgroundSubtractor> mogSubstractor = createBackgroundSubtractorMOG2();
    Mat frame,gauss,mask;
    Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
    int count=0;
    char text[8];
    while(capture.read(frame)){
        GaussianBlur(frame,gauss,Size(5,5),0,0);
        mogSubstractor->apply(gauss,mask);//获取mask
        threshold(mask,mask,0,255,THRESH_BINARY|cv::THRESH_OTSU);
        //执行形态学操作
        morphologyEx(mask,mask,MORPH_OPEN,kernel);
        dilate(mask,mask,kernel,Point(-1,-1));
        imshow("mask",mask);
 
        //找到最大轮廓定位外接矩形
        vector<vector<Point>> contours;
        vector<Vec4i> heri;
        //寻找最大外接矩形
        findContours(mask,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
        count = 0;
        for(size_t i = 0;i<contours.size();i++){
            double area = contourArea(contours[i]);
            if(area<5000){
                continue;
            }
            Rect rect = boundingRect(contours[i]);
            qDebug()<<rect.width<<":"<<rect.height;
            if (rect.width < 200 || rect.height < 100) continue;
            count++;
            rectangle(frame,rect,Scalar(0,0,255),3,8);
            sprintf(text,"%d",count);
            putText(frame,text,Point(rect.x+rect.width/2,rect.y+rect.height/2),FONT_ITALIC, FONT_HERSHEY_PLAIN,Scalar(0,255,0),2,8);
        }
 
 
        imshow("frame",frame);
 
        int c = waitKey(1);
        if(c==27){
            break;
        }
    }
    capture.release();
 
}

3、演示图片

到此这篇关于OpenCV使用BSM统计视频中移动的对象的文章就介绍到这了,更多相关OpenCV BSM统计视频移动对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++强制类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)

    C++强制类型转换(static_cast、dynamic_cast、const_cast、reinterpret_ca

    本文主要介绍了C++强制类型转换,主要介绍了static_cast、dynamic_cast、const_cast、reinterpret_cast的4种方法,感兴趣的可以了解一下
    2021-08-08
  • c++primer:变量和基本类型详解

    c++primer:变量和基本类型详解

    今天小编就为大家分享一篇关于C++Primer中变量和基本类型的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • C++实现统计代码运行时间的示例详解

    C++实现统计代码运行时间的示例详解

    这篇文章主要为大家详细介绍了C++一个有趣的小项目——统计代码运行时间,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • C 字符串数组排序的小例子

    C 字符串数组排序的小例子

    C 字符串数组排序的小例子,需要的朋友可以参考一下
    2013-03-03
  • 深入理解链表的各类操作详解

    深入理解链表的各类操作详解

    本篇文章是对链表的各类操作进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++中的指针最全总结

    c++中的指针最全总结

    指针是整个C++的精髓所在,只有精通了指针才可以说是掌握了C++,可以说学习C++的过程是个熟练掌握和使用指针的过程,下面这篇文章主要给大家介绍了关于c++中指针的相关资料,需要的朋友可以参考下
    2024-04-04
  • OpenCV 图像拼接和图像融合的实现

    OpenCV 图像拼接和图像融合的实现

    本文主要介绍了OpenCV 图像拼接和图像融合,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C/C++指针与内存管理图文详解

    C/C++指针与内存管理图文详解

    这篇文章主要为大家详细介绍了C/C++指针与内存管理,使用文图并叙的方式,文中图片介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 简单谈谈C++ 头文件系列之(algorithm)

    简单谈谈C++ 头文件系列之(algorithm)

    <algorithm>是c++特有的STL模板的算法头文件 包含了一些特定的算法函数 包括sort(),stable_sort(),partical_sort(),nth_element()等常用的算法函数
    2017-02-02
  • 使用C语言绘制统计图中的饼图

    使用C语言绘制统计图中的饼图

    常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图,本文主要为大家详细介绍了如何使用使用C语言绘制统计图中的饼图,希望对大家有所帮助
    2024-02-02

最新评论