From bf51dec8dcaa9a3b2d0451cf26f530444ced5c0a Mon Sep 17 00:00:00 2001 From: "Reynaldo H. Verdejo Pinochet" Date: Tue, 5 Dec 2017 17:11:41 -0800 Subject: opencv: facedetect: Add adaptive off-center damping This is a naive adaptive-damping implementation for out-of-center detection flickering. This modification makes it so a the damping factor is not harcoded but computed. Default is 5% of magnitude. Additionally: Add braces around multiline if statement body (for clarity) --- ext/opencv/gstfacedetect.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ext/opencv/gstfacedetect.cpp b/ext/opencv/gstfacedetect.cpp index e78e4c43c..1f351ee3a 100644 --- a/ext/opencv/gstfacedetect.cpp +++ b/ext/opencv/gstfacedetect.cpp @@ -595,7 +595,11 @@ gst_face_detect_run_detector (GstFaceDetect * filter, } } +/** + * Delta percentaje after wich position is considered off-center + */ #define LINEAR_DAMPING_FACTOR 5 + /** * @gst_face_detect_get_leaning_side * @@ -603,12 +607,17 @@ gst_face_detect_run_detector (GstFaceDetect * filter, * @pos: Object x coordinate * @ref_pos: Reference x coordinate * @side: result. DIRECTION_RIGHT or DIRECTION_LEFT. Untouched if inconclusive + * @displacement: Magnitude of min to max ramp */ static inline void -gst_face_detect_get_leaning_side (guint *side, gint reference, gint position) { +gst_face_detect_get_leaning_side (guint *side, gint reference, gint position, + guint displacement) { + g_assert (side); - if (ABS (position - reference) < LINEAR_DAMPING_FACTOR) + displacement = displacement * LINEAR_DAMPING_FACTOR / 100; + + if ((guint)ABS (position - reference) <= displacement) return; if (position > reference) @@ -812,7 +821,8 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, center.y = cvRound ((rny + sr.y + h)); /* left/right toggle */ - gst_face_detect_get_leaning_side (&aim, f_center.x, center.x); + gst_face_detect_get_leaning_side (&aim, f_center.x, center.x, + r.width); axes.width = w; axes.height = h * 1.25; /* tweak for nose form */ @@ -827,8 +837,10 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, center.x = cvRound ((rmx + sr.x + w)); center.y = cvRound ((rmy + sr.y + h)); - if (!aim) - gst_face_detect_get_leaning_side (&aim, f_center.x, center.x); + if (!aim) { + gst_face_detect_get_leaning_side (&aim, f_center.x, center.x, + r.width); + } axes.width = w * 1.5; /* tweak for mouth form */ axes.height = h; -- cgit v1.2.3