Fix segmentation fault by adjust imprecise face location in tracker
This commit is contained in:
parent
79c82e0a6c
commit
84836f6ec9
@ -472,8 +472,14 @@ void NvInferServerManager::update_frame_with_face_body_meta(
|
|||||||
text_params_imprecise_face.display_text =
|
text_params_imprecise_face.display_text =
|
||||||
g_strdup(imprecise_face_str[0]); // g_strdup(pgie_class_str[0]);
|
g_strdup(imprecise_face_str[0]); // g_strdup(pgie_class_str[0]);
|
||||||
/* Display text above the left top corner of the object. */
|
/* Display text above the left top corner of the object. */
|
||||||
text_params_imprecise_face.x_offset = rect_params_imprecise_face.left;
|
text_params_imprecise_face.x_offset =
|
||||||
text_params_imprecise_face.y_offset = rect_params_imprecise_face.top;
|
(rect_params_imprecise_face.left - 15 < 0)
|
||||||
|
? 15
|
||||||
|
: rect_params_imprecise_face.left - 15;
|
||||||
|
text_params_imprecise_face.y_offset =
|
||||||
|
(rect_params_imprecise_face.top - 15 < 0)
|
||||||
|
? 15
|
||||||
|
: rect_params_imprecise_face.top - 15;
|
||||||
/* Set black background for the text. */
|
/* Set black background for the text. */
|
||||||
text_params_imprecise_face.set_bg_clr = 1;
|
text_params_imprecise_face.set_bg_clr = 1;
|
||||||
text_params_imprecise_face.text_bg_clr = NvOSD_ColorParams{0, 0, 0, 1};
|
text_params_imprecise_face.text_bg_clr = NvOSD_ColorParams{0, 0, 0, 1};
|
||||||
@ -535,9 +541,9 @@ void NvInferServerManager::update_frame_with_face_body_meta(
|
|||||||
// face_obj->object_id);
|
// face_obj->object_id);
|
||||||
/* Display text above the left top corner of the object. */
|
/* Display text above the left top corner of the object. */
|
||||||
text_params_body.x_offset =
|
text_params_body.x_offset =
|
||||||
(rect_params_body.left - 30 < 0) ? 0 : rect_params_body.left - 30;
|
(rect_params_body.left - 30 < 0) ? 10 : rect_params_body.left - 30;
|
||||||
text_params_body.y_offset =
|
text_params_body.y_offset =
|
||||||
(rect_params_body.top - 30 < 0) ? 0 : rect_params_body.top - 30;
|
(rect_params_body.top - 30 < 0) ? 10 : rect_params_body.top - 30;
|
||||||
|
|
||||||
/* Set black background for the text. */
|
/* Set black background for the text. */
|
||||||
text_params_body.set_bg_clr = 1;
|
text_params_body.set_bg_clr = 1;
|
||||||
|
|||||||
@ -321,6 +321,8 @@ GstPadProbeReturn NvTrackerManager::tracker_src_pad_buffer_probe(
|
|||||||
face_rect_params->width = x2 - x1;
|
face_rect_params->width = x2 - x1;
|
||||||
face_rect_params->height = y2 - y1;
|
face_rect_params->height = y2 - y1;
|
||||||
|
|
||||||
|
clamp_rect_params(frame_meta, face_rect_params);
|
||||||
|
|
||||||
NvDsObjectMeta *face_obj =
|
NvDsObjectMeta *face_obj =
|
||||||
nvds_acquire_obj_meta_from_pool(batch_meta);
|
nvds_acquire_obj_meta_from_pool(batch_meta);
|
||||||
face_obj->unique_component_id =
|
face_obj->unique_component_id =
|
||||||
@ -372,8 +374,13 @@ GstPadProbeReturn NvTrackerManager::tracker_src_pad_buffer_probe(
|
|||||||
// obj_meta->object_id, final_face_obj->object_id);
|
// obj_meta->object_id, final_face_obj->object_id);
|
||||||
/* Display text above the left top corner of the
|
/* Display text above the left top corner of the
|
||||||
* object.*/
|
* object.*/
|
||||||
text_params.x_offset = rect_params.left;
|
text_params.x_offset = (rect_params.left - 15 < 0)
|
||||||
text_params.y_offset = rect_params.top + 30;
|
? 15
|
||||||
|
: rect_params.left - 15;
|
||||||
|
text_params.y_offset = (rect_params.top - 15 < 0)
|
||||||
|
? 15
|
||||||
|
: rect_params.top - 15;
|
||||||
|
|
||||||
/* Set black background for the text. */
|
/* Set black background for the text. */
|
||||||
text_params.set_bg_clr = 1;
|
text_params.set_bg_clr = 1;
|
||||||
text_params.text_bg_clr = NvOSD_ColorParams{0, 0, 0, 1};
|
text_params.text_bg_clr = NvOSD_ColorParams{0, 0, 0, 1};
|
||||||
@ -543,4 +550,49 @@ GstPadProbeReturn NvTrackerManager::tracker_src_pad_buffer_probe(
|
|||||||
|
|
||||||
frame_number++;
|
frame_number++;
|
||||||
return GST_PAD_PROBE_OK;
|
return GST_PAD_PROBE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NvTrackerManager::clamp_rect_params(NvDsFrameMeta *frame_meta,
|
||||||
|
NvOSD_RectParams *rect_params) {
|
||||||
|
guint frame_width = frame_meta->source_frame_width;
|
||||||
|
guint frame_height = frame_meta->source_frame_height;
|
||||||
|
|
||||||
|
// read values (DeepStream stores rect params as floats)
|
||||||
|
float left = rect_params->left;
|
||||||
|
float top = rect_params->top;
|
||||||
|
float width = rect_params->width;
|
||||||
|
float height = rect_params->height;
|
||||||
|
float right = left + width;
|
||||||
|
float bottom = top + height;
|
||||||
|
|
||||||
|
// CHECK for invalid numbers (NaN/inf) or out-of-bounds
|
||||||
|
bool invalid = false;
|
||||||
|
if (!std::isfinite(left) || !std::isfinite(top) || !std::isfinite(width) ||
|
||||||
|
!std::isfinite(height)) {
|
||||||
|
invalid = true;
|
||||||
|
} else if (width <= 0.0f || height <= 0.0f) {
|
||||||
|
invalid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clamp coordinates into frame (clip)
|
||||||
|
float clamped_left =
|
||||||
|
std::max(0.0f, std::min(left, (float)frame_width - 1.0f));
|
||||||
|
float clamped_top =
|
||||||
|
std::max(0.0f, std::min(top, (float)frame_height - 1.0f));
|
||||||
|
float clamped_right = abs(std::min(right, (float)frame_width - 1.0f));
|
||||||
|
float clamped_bottom = abs(std::min(bottom, (float)frame_height - 1.0f));
|
||||||
|
|
||||||
|
float clamped_w = clamped_right - clamped_left;
|
||||||
|
float clamped_h = clamped_bottom - clamped_top;
|
||||||
|
if (clamped_w <= 0.0f || clamped_h <= 0.0f) {
|
||||||
|
invalid = true;
|
||||||
|
}
|
||||||
|
(void)invalid;
|
||||||
|
|
||||||
|
rect_params->left = clamped_left;
|
||||||
|
rect_params->top = clamped_top;
|
||||||
|
rect_params->width = clamped_w;
|
||||||
|
rect_params->height = clamped_h;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -57,4 +57,5 @@ class NvTrackerManager {
|
|||||||
static std::optional<
|
static std::optional<
|
||||||
std::tuple<std::tuple<float, float, float, float>, float>>
|
std::tuple<std::tuple<float, float, float, float>, float>>
|
||||||
face_box_extract(float *);
|
face_box_extract(float *);
|
||||||
|
static void clamp_rect_params(NvDsFrameMeta *, NvOSD_RectParams *);
|
||||||
};
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user