【问题标题】:How to detect human using findcontours based on the human shape?如何使用基于人体形状的 findcontours 检测人体?
【发布时间】:2013-06-06 19:19:15
【问题描述】:

我想问如何在 blob(findcontours)上检测人类或行人?我尝试学习如何使用 findcontours() 来检测框架上的任何对象,如下所示:

#include"stdafx.h"
#include<vector>
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
    cv::Mat frame;                                              
    cv::Mat fg;     
    cv::Mat blurred;
    cv::Mat thresholded;
    cv::Mat thresholded2;
    cv::Mat result;
    cv::Mat bgmodel;                                            
    cv::namedWindow("Frame");   
    cv::namedWindow("Background Model"
        //,CV_WINDOW_NORMAL
        );
    //cv::resizeWindow("Background Model",400,300);
    cv::namedWindow("Blob"
        //,CV_WINDOW_NORMAL
        );
    //cv::resizeWindow("Blob",400,300);
    cv::VideoCapture cap("campus3.avi");    

    cv::BackgroundSubtractorMOG2 bgs;                           

        bgs.nmixtures = 3;
        bgs.history = 1000;
        bgs.varThresholdGen = 15;
        bgs.bShadowDetection = true;                            
        bgs.nShadowDetection = 0;                               
        bgs.fTau = 0.5;                                         

    std::vector<std::vector<cv::Point>> contours;               

    for(;;)
    {
        cap >> frame;                                           

        cv::GaussianBlur(frame,blurred,cv::Size(3,3),0,0,cv::BORDER_DEFAULT);

        bgs.operator()(blurred,fg);                         
        bgs.getBackgroundImage(bgmodel);                                

        cv::threshold(fg,thresholded,70.0f,255,CV_THRESH_BINARY);
        cv::threshold(fg,thresholded2,70.0f,255,CV_THRESH_BINARY);

        cv::Mat elementCLOSE(5,5,CV_8U,cv::Scalar(1));
        cv::morphologyEx(thresholded,thresholded,cv::MORPH_CLOSE,elementCLOSE);
        cv::morphologyEx(thresholded2,thresholded2,cv::MORPH_CLOSE,elementCLOSE);

        cv::findContours(thresholded,contours,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);
        cv::cvtColor(thresholded2,result,CV_GRAY2RGB);

        int cmin = 50; 
        int cmax = 1000;

        std::vector<std::vector<cv::Point>>::iterator itc=contours.begin();

        while (itc!=contours.end()) {   

                if (itc->size() > cmin && itc->size() < cmax){ 

                        std::vector<cv::Point> pts = *itc;
                        cv::Mat pointsMatrix = cv::Mat(pts);
                        cv::Scalar color( 0, 255, 0 );

                        cv::Rect r0= cv::boundingRect(pointsMatrix);
                        cv::rectangle(frame,r0,color,2);

                        ++itc;
                    }else{++itc;}
        }

        cv::imshow("Frame",frame);
        cv::imshow("Background Model",bgmodel);
        cv::imshow("Blob",result);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}

现在我想知道如何检测人类?我需要用猪吗?还是哈尔?如果是,我需要使用它们,如何使用它们?任何教程来学习如何使用它?因为我很好奇!当我学习 OpenCV 时非常有趣!太上瘾了! :))

无论如何,我会很感激这里的任何帮助,谢谢。 :)

【问题讨论】:

  • 是的,在每一帧上都使用 HoG。或尝试classifier
  • 如何创建头部+上身+下身的xml分类器?有没有关于它的教程?
  • 他们是给定的。签入 OpenCV245/opencv/data/haarcascades。
  • 好的!我会检查的!谢谢威尔! :)

标签: opencv contour blobs haar-wavelet


【解决方案1】:

这是一个好的开始,充满了热情。对图像/图像序列进行人体检测的方法不止一种。我总结了以下几点:

  1. 由于您已经在提取应该是人或物体的 blob,因此您可以将这些 blob 的特征与场景中人类产生的 blob 的特征进行比较。很多人看头肩区的形状,斑点的高度和面积等等。

  2. 您还可以查看研究论文,如this one。与最近的论文相比,早期的研究更容易理解和编码。

  3. 除了使用背景减法之外,您还可以使用基于 Haar 小波的检测方法。这广泛用于人脸检测,但 opencv 包含一个用于上身检测的模型。您还可以构建自己的模型,如 here 所述。

玩得开心!

【讨论】:

  • 哇,谢谢!嗯..如果我想使用haar,那么我不需要背景减法,不是吗?霍格呢?但我想我想结合两种方法进行鲁棒检测,首先我会跟踪头肩的形状,然后我会跟踪运动。我在这里有一个有趣的stackoverflow.com/questions/5726575/…,但我仍然需要从研究论文和一些如何使用 haar 和 hog 的教程中获得更多信息。 >.
猜你喜欢
  • 2014-02-20
  • 2021-03-31
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
相关资源
最近更新 更多