在C#中从视频源检测人体

时间:2011-07-16 06:45:42

标签: c# image-processing video-processing image-recognition aforge

我正在尝试从视频源中提取人,以便我以后可以使用他的图像。我只需要提取人体,而忽视环境。好处是背景是静态的。我尝试使用AForge并应用CustomFrameDifferenceDetector过滤器,它将当前帧与静态背景图像进行比较,并提取不同的像素(差异>阈值)。它效果很好,但是当皮肤或部分衣服具有与背景相似的颜色时会出现问题。在这些情况下,过滤器忽略这些部件,结果在身体上有各种孔。简单地降低阈值并不能解决问题,因为身体阴影和其他噪声增加(即使在噪声抑制下)。

你知道这个问题的任何已知解决方案吗?还是尚未解决的问题?

2 个答案:

答案 0 :(得分:3)

这是一个很难解决的问题(也是微软Kinect不使用可见光的原因之一,以及为什么蓝/绿色筛选仍然如此受欢迎)。我试图去除洞(你应该能够预测身体的位置)。如果您具有处理能力,请使用不同的阈值并合并结果。您也可以尝试过滤新的分离图像(例如,将当前帧添加到最后一帧并对结果进行标准化)。通过这种方式,您可以跟踪一帧中丢失的形状更加一致。

另一种方法:使用检测到的形状/区域仅检测身体的位置。即忽略其特定的形状,并在估计的身体位置上方/周围使用预制的shapre。如果你想做某种类似蓝屏的行为,这很可能不会起作用,但它可能有助于关闭漏洞。

答案 1 :(得分:0)

Alturos.Yolo完全满足您的需求。

Yolo从带注释的图像中学习如何检测所需的对象。首先,您需要使用Nuget软件包管理器安装项目,以及一组已经训练好的图像。在您的情况下,YOLOv2-tiny模型就足够了:

Install-Package Alturos.Yolo
Install-Package Alturos.YoloV2TinyVocData 

安装后,您可以像这样使用它来检测图像中的人:

using (var yoloWrapper = new YoloWrapper("yolov2-tiny-voc.cfg", "yolov2-tiny-voc.weights", "voc.names"))
{
    var items = yoloWrapper.Detect(@"your_image.jpg");
    //if (items[0].Type == "Person") { ... }
}

items数组将包含有关找到的所有对象的信息。您可以使用Type属性检查那里是否有人。