gpt4 book ai didi

opencv - 如何使用基于人体形状的 findcontours 检测人体?

转载 作者:行者123 更新时间:2023-12-02 17:14:25 25 4
gpt4 key购买 nike

我想问如何在 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;
}

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

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

最佳答案

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

  • 由于您已经在提取应该是人或对象的 blob,因此您可以将这些 blob 的特征与场景中人类产生的 blob 的特征进行比较。很多人看头肩区的形状, Blob 的高度和面积等等。
  • 您还可以查看研究论文,例如 this one .与最近的论文相比,早期的研究更容易理解和编码。
  • 除了使用背景减法,您还可以使用基于 Haar Wavelet 的检测方法。这广泛用于人脸检测,但opencv包含一个用于上身检测的模型。您还可以构建自己的模型,如 here 所述.

  • 玩得开心!

    关于opencv - 如何使用基于人体形状的 findcontours 检测人体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035676/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com