2014-02-16 4 views
2

Я пытаюсь улучшить обнаружение лица из захвата камеры, поэтому я подумал, что было бы лучше, если бы перед процессом обнаружения лица я удалил фон с изображения, Я использую BackgroundSubtractorMOG и CascadeClassifier с lbpcascade_frontalface для определения лица,Обнаружение лица после фоновой субтракции с использованием openCv

Мой вопрос: как я могу захватить изображение переднего плана, чтобы использовать его в качестве входного сигнала для обнаружения лица? это то, что я до сих пор:

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); 
} 

Благодарности

ответ

0

Если у вас есть входное изображение и переднего плана маску, это прямо вперед. В C++ я бы просто добавил (только там, где вы разместили свой комментарий): image.copyTo(fgimage,fgMaskMOG);

Я не знаком с интерфейсом java, но это должно быть очень похоже. Просто не забудьте правильно инициализировать fgimage и сбросить его каждый кадр.

+0

отлично, вчера вечером я понял, что могу использовать copyTo ... Я также добавил эрозию, чтобы избежать шума, спасибо –

0

Я могу ответить на C++ с использованием BackgroundSubtractorMOG2:

Вы можете использовать либо эрозию или пройти более высокую пороговую величину на 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); 
} 

Таким образом, вы сократите область поиска для каскадного классификатором, который не только делает его более быстрым, но и уменьшает ложное положительное лицо.

Смежные вопросы