Opencv和图像处理:提取身体框架的轮廓

Posted

技术标签:

【中文标题】Opencv和图像处理:提取身体框架的轮廓【英文标题】:Opencv and Image Processing: Extracting contour of the body frame 【发布时间】:2013-03-24 23:38:48 【问题描述】:

我是图像处理的初学者,刚开始为一个项目摆弄 OpenCV。我有一个行人行走的视频信号。我正在运行 pedestrain.cpp 程序,该程序使用 HOG 进行 bckgound 减法,并想做类似所附图像的事情。在检测到 peson 后,我做了以下操作

int main (int argc, const char * argv[])

    VideoCapture cap(0);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);    
    if (!cap.isOpened())
        return -1;

    Mat img;
    HOGDescriptor hog;
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    if((WriteFP=fopen("output.txt", "w")) == NULL) ErrorExit(ER_WRITE_OPEN);


    namedWindow("video capture", CV_WINDOW_AUTOSIZE);
    namedWindow("Motion", CV_WINDOW_AUTOSIZE);


    while (true)
    
        cap >> img;
        if (!img.data)
            continue;

        vector<Rect> found, found_filtered;
        hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);

        size_t i, j;
        for (i=0; i<found.size(); i++)
        
            Rect r = found[i];
            for (j=0; j<found.size(); j++)
                if (j!=i && (r & found[j])==r)
                    break;
            if (j==found.size())
                found_filtered.push_back(r);
        
        for (i=0; i<found_filtered.size(); i++)
        
        Rect r = found_filtered[i];
            r.x += cvRound(r.width*0.1);
        r.width = cvRound(r.width*0.8);
        r.y += cvRound(r.height*0.06);
        r.height = cvRound(r.height*0.9);
        rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 2);
        
        imshow("video capture", img);
        IplImage *mat_img;

        mat_img=cvCloneImage(&(IplImage)img);
        cvThreshold(img,img, 0, 255, CV_THRESH_BINARY_INV);
    cvDilate(img, img, 0,1);
    cvErode(img, img, 0, 0);
    cvFindContours(img, storage_contours, &contours, sizeof(CvContour),
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));

但是,我无法获得图片中的输出帧。谁能告诉我需要做什么。谢谢

【问题讨论】:

不要将 HoG(梯度直方图)人物检测器与背景建模/背景减法技术混合使用。从 Person detektor 你得到一个边界框,从 Background Modeling 方法你得到一个前景对象的 shilouette。 谢谢。我尝试了背景减法,但无法得到图片中的轮廓。您能否发布代码或链接,以便我可以得到轮廓。 您能否解释一下,您的输入数据是什么或您的确切问题是什么?您是否有行人的 RGB 视频并想要一个前景/Shilouhette 蒙版,就像您在顶部显示的那样?或者您是否搜索了一种提取 shilouhette 的方法,并且您的输入视频是您在顶部显示的前景蒙版。 我有一个行人的RGB视频,想要一个如图所示的剪影蒙版。 如果您可以发布您的结果和输入图像的样本,也许我们可以帮助您参数化您的方法。我对 Ruben Heras Evangelio 的“混合模型中的高斯分割”方法有很好的经验 【参考方案1】:

在Change Detection Benchmark,您可以找到最先进的背景建模方法和实现的概述。

OpenCV 为背景建模和前景减法提供BackgroundSubtractorMOG 类。

大多数方法训练背景颜色的像素统计,如果像素颜色不属于背景统计,则确定像素是前景还是背景。因此,这些方法需要一组训练样本(图像)来学习背景。您还应该提到,背景和前景对象的相似颜色可能会导致前景蒙版中出现空洞,因为该算法只能通过颜色在这两个类别之间进行划分。

【讨论】:

感谢您的回复。我仍然不明白如何提及阈值。我刚刚实现了 OpenCV 资源中可用的 peopledetect.cpp 程序。该程序在检测到的人周围绘制边界框。我相信边界框的大小有一组固定的参数。所以,我想知道你提到的背景减法技术是否以及如何去做。实际上,我对图像处理几乎一无所知,我只是潜入它适用于小型项目需求。

以上是关于Opencv和图像处理:提取身体框架的轮廓的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV函数cvFindContous提取图像轮廓

opencv中轮廓内部的像素点怎么提取

OpenCV与EmguCV中的图像轮廓提取

使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

python-opencv在有噪音的情况下提取图像的轮廓

OpenCV实战(14)——图像线条提取