Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何使用基于人体形状的FindContentors检测人体?_Opencv_Contour_Blobs_Haar Wavelet - Fatal编程技术网

Opencv 如何使用基于人体形状的FindContentors检测人体?

Opencv 如何使用基于人体形状的FindContentors检测人体?,opencv,contour,blobs,haar-wavelet,Opencv,Contour,Blobs,Haar Wavelet,我想问一下如何在blob(findcontours)上检测人类或行人?我尝试学习如何使用FindOnTours()检测帧上的任何对象,如下所示: #include"stdafx.h" #include<vector> #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/core/core.hpp> #include<opencv2/imgproc/imgproc.h

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

#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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
cv::垫架;
cv::Mat-fg;
cv::Mat模糊;
cv::设定阈值的Mat;
cv::Mat阈值2;
cv::Mat结果;
cv::Mat-bgmodel;
cv::namedWindow(“框架”);
cv::namedWindow(“背景模型”
//,CV_窗口_正常
);
//cv::调整窗口大小(“背景模型”,400300);
cv::namedWindow(“Blob”
//,CV_窗口_正常
);
//cv::调整窗口大小(“Blob”,400300);
cv::视频捕获cap(“campus3.avi”);
cv::背景MOG2 bgs;
bgs.nmixtures=3;
bgs.history=1000;
bgs.varThresholdGen=15;
bgs.bShadowDetection=true;
bgs.nShadowDetection=0;
bgs.fTau=0.5;
矢量轮廓;
对于(;;)
{
cap>>框架;
cv::GaussianBlur(帧,模糊,cv::大小(3,3),0,0,cv::边界_默认值);
bgs.operator()(模糊,前景);
getBackgroundImage(bgmodel);
cv::阈值(fg,阈值化,70.0f,255,cv_阈值二元);
cv::阈值(fg,阈值2,70.0f,255,cv_阈值二元);
cv::Mat elementCLOSE(5,5,cv_8U,cv::Scalar(1));
cv::morphologyEx(阈值化,阈值化,cv::Morpho_CLOSE,elementCLOSE);
cv::morphologyEx(阈值2,阈值2,cv::Morpho_CLOSE,elementCLOSE);
cv::findContours(阈值、轮廓、cv_RETR_CCOMP、cv_CHAIN_近似_SIMPLE);
cv::cvtColor(阈值2,结果,cv_GRAY2RGB);
int-cmin=50;
int cmax=1000;
std::vector::iterator itc=contours.begin();
while(itc!=contours.end()){
如果(itc->size()>cmin&&itc->size()=0)中断;
}
返回0;
}
现在我想知道如何探测人类?我需要用猪吗?还是哈尔?如果是,我需要使用它们,如何使用它们?有学习如何使用它的教程吗?因为我太好奇了!当我学习OpenCV时,它是如此的有趣!太让人上瘾了!:)


无论如何,我会感谢您的帮助,谢谢。:)

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

  • 由于您已经在提取假定为人物或对象的水滴,因此可以将这些水滴的特征与场景中由人生成的水滴的特征进行比较。许多人会观察头肩区域的形状、水滴的高度和面积等

  • 你也可以看看像这样的研究论文。与最近的论文相比,早期的研究更容易理解和编码

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


  • 玩得开心

    哇,谢谢!六羟甲基三聚氰胺六甲醚。。如果我想用haar,所以我不需要背景减法,不是吗?猪怎么样?但是我想我要结合两种方法来进行鲁棒检测,首先我要跟踪头肩的形状,然后我要跟踪运动。我这里有一个有趣的例子,但我仍然需要从研究论文和一些如何使用haar和hog的教程中获得更多信息。是的,在每一帧上使用HoG。或者尝试一个。如何为head+upperbody+lowerbody创建xml分类器?有关于它的教程吗?有。签入OpenCV245/opencv/data/haarcascades.Ok!我会检查的!谢谢威尔!:)