2

我正在尝试从相机捕获中改进人脸检测,所以我认为如果在人脸检测过程之前我从图像中删除背景会更好,我正在使用BackgroundSubtractorMOGand CascadeClassifierwithlbpcascade_frontalface进行人脸检测,

我的问题是:如何获取前景图像以将其用作人脸检测的输入?这就是我到目前为止所拥有的:

while (true) {
    capture.retrieve(image);

    mog.apply(image, fgMaskMOG, training?LEARNING_RATE:0);

    if (counter++ > LEARNING_LIMIT) {
        training = false;
    }

    // I think something should be done HERE to 'apply' the foreground mask 
    // to the original image before passing it to the classifier..

    MatOfRect faces = new MatOfRect();
    classifier.detectMultiScale(image, faces);

    // draw faces rect
    for (Rect rect : faces.toArray()) {
        Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0));
    }

    // show capture in JFrame
    frame.update(image);
    frameFg.update(fgMaskMOG);

    Thread.sleep(1000 / FPS);
}

谢谢

4

2 回答 2

1

我可以使用BackgroundSubtractorMOG2在 C++ 中回答:

您可以使用腐蚀或将更高的阈值传递给 MOG 背景减法器以消除噪声。为了完全摆脱噪声和误报,您还可以模糊蒙版图像,然后应用阈值:

// Blur the mask image
blur(fgMaskMOG2, fgMaskMOG2, Size(5,5), Point(-1,-1));

// Remove the shadow parts and the noise
threshold(fgMaskMOG2, fgMaskMOG2, 128, 255, 0);

现在你可以很容易地找到包围前景区域的矩形并将这个区域传递给级联分类器:

// Find the foreground bounding rectangle
Mat fgPoints;
findNonZero(fgMaskMOG2, fgPoints);
Rect fgBoundRect = boundingRect(fgPoints);

// Crop the foreground ROI
Mat fgROI = image(fgBoundRect);

// Detect the faces
vector<Rect> faces;
face_cascade.detectMultiScale(fgROI, faces, 1.3, 3, 0|CV_HAAR_SCALE_IMAGE, Size(32, 32));

// Display the face ROIs
for(size_t i = 0; i < faces.size(); ++i) 
{
    Point center(fgBoundRect.x + faces[i].x + faces[i].width*0.5, fgBoundRect.y + faces[i].y + faces[i].height*0.5);
    circle(image, center, faces[i].width*0.5, Scalar(255, 255, 0), 4, 8, 0);
} 

通过这种方式,您将减少级联分类器的搜索区域,这不仅使其速度更快,而且还减少了误报人脸。

于 2016-09-01T22:32:11.597 回答
0

如果您有输入图像和前景蒙版,这很简单。在 C++ 中,我会简单地添加(就在您发表评论的地方):image.copyTo(fgimage,fgMaskMOG);

我不熟悉java接口,但这应该很相似。只是不要忘记在fgimage每一帧正确初始化和重置它。

于 2014-02-17T07:49:00.803 回答