facedetect: don't skip faces

Skipping faces at this point makes us lie about the num-ber of faces and also
causes leaks.
This commit is contained in:
Stefan Sauer 2012-03-15 22:22:12 +01:00
parent e6c9b60851
commit 3d7c8aad70

View File

@ -514,8 +514,6 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
for (i = 0; i < (faces ? faces->total : 0); i++) { for (i = 0; i < (faces ? faces->total : 0); i++) {
CvRect *r = (CvRect *) cvGetSeqElem (faces, i); CvRect *r = (CvRect *) cvGetSeqElem (faces, i);
GValue value = { 0 };
GstStructure *s;
guint mw = filter->min_size_width / 8; guint mw = filter->min_size_width / 8;
guint mh = filter->min_size_height / 8; guint mh = filter->min_size_height / 8;
guint rnx, rny, rnw, rnh; guint rnx, rny, rnw, rnh;
@ -578,50 +576,51 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
i, faces->total, r->x, r->y, r->width, r->height, i, faces->total, r->x, r->y, r->width, r->height,
have_eyes, have_nose, have_mouth); have_eyes, have_nose, have_mouth);
/* ignore 'face' where we don't fix mount/nose/eyes ? */ if (msg) {
if (!(have_eyes && have_nose && have_mouth)) GValue value = { 0 };
continue; GstStructure *s;
s = gst_structure_new ("face", s = gst_structure_new ("face",
"x", G_TYPE_UINT, r->x, "x", G_TYPE_UINT, r->x,
"y", G_TYPE_UINT, r->y, "y", G_TYPE_UINT, r->y,
"width", G_TYPE_UINT, r->width, "width", G_TYPE_UINT, r->width,
"height", G_TYPE_UINT, r->height, NULL); "height", G_TYPE_UINT, r->height, NULL);
if (nose && nose->total) { if (nose && nose->total) {
CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0);
GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u",
nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height);
gst_structure_set (s, gst_structure_set (s,
"nose->x", G_TYPE_UINT, rnx + sr->x, "nose->x", G_TYPE_UINT, rnx + sr->x,
"nose->y", G_TYPE_UINT, rny + sr->y, "nose->y", G_TYPE_UINT, rny + sr->y,
"nose->width", G_TYPE_UINT, sr->width, "nose->width", G_TYPE_UINT, sr->width,
"nose->height", G_TYPE_UINT, sr->height, NULL); "nose->height", G_TYPE_UINT, sr->height, NULL);
} }
if (mouth && mouth->total) { if (mouth && mouth->total) {
CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0);
GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u",
mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height);
gst_structure_set (s, gst_structure_set (s,
"mouth->x", G_TYPE_UINT, rmx + sr->x, "mouth->x", G_TYPE_UINT, rmx + sr->x,
"mouth->y", G_TYPE_UINT, rmy + sr->y, "mouth->y", G_TYPE_UINT, rmy + sr->y,
"mouth->width", G_TYPE_UINT, sr->width, "mouth->width", G_TYPE_UINT, sr->width,
"mouth->height", G_TYPE_UINT, sr->height, NULL); "mouth->height", G_TYPE_UINT, sr->height, NULL);
} }
if (eyes && eyes->total) { if (eyes && eyes->total) {
CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0);
GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u",
eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height);
gst_structure_set (s, gst_structure_set (s,
"eyes->x", G_TYPE_UINT, rex + sr->x, "eyes->x", G_TYPE_UINT, rex + sr->x,
"eyes->y", G_TYPE_UINT, rey + sr->y, "eyes->y", G_TYPE_UINT, rey + sr->y,
"eyes->width", G_TYPE_UINT, sr->width, "eyes->width", G_TYPE_UINT, sr->width,
"eyes->height", G_TYPE_UINT, sr->height, NULL); "eyes->height", G_TYPE_UINT, sr->height, NULL);
} }
g_value_init (&value, GST_TYPE_STRUCTURE); g_value_init (&value, GST_TYPE_STRUCTURE);
gst_value_set_structure (&value, s); gst_value_set_structure (&value, s);
gst_value_list_append_value (&facelist, &value); gst_value_list_append_value (&facelist, &value);
g_value_unset (&value); g_value_unset (&value);
}
if (do_display) { if (do_display) {
CvPoint center; CvPoint center;