ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-25 23:02:16  阅读:191  来源: 互联网

标签:视频 Tracking OpenCV frame Object mask BSM Move


一、概述

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

  实现步骤:

    1.实例化VideoCapture

    2.创建BackgroundSubstractor

    3.while循环读取视频帧

    4.使用BS->apply获取mask

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

    6.使用findContours执行轮廓发现

    7.统计最大外接矩形

    8.输出结果

 

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

二、代码示例

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();

}

 

三、演示图片

 

标签:视频,Tracking,OpenCV,frame,Object,mask,BSM,Move
来源: https://www.cnblogs.com/tony-yang-flutter/p/16192471.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有