makefile
all:
@make -C nvinfer_custom_lpr_parser
@make -C deepstream-lpr-app
clean:
@make clean -C nvinfer_custom_lpr_parser
@make clean -C deepstream-lpr-app
编译deepstream-lpr-app
存结果的两个句柄
typedef struct _NvDsObjectMeta {
NvDsBaseMeta base_meta;
struct _NvDsObjectMeta *parent;
gint unique_component_id;
gint class_id;
guint64 object_id;
NvDsComp_BboxInfo detector_bbox_info;
NvDsComp_BboxInfo tracker_bbox_info;
gfloat confidence;
gfloat tracker_confidence;
NvOSD_RectParams rect_params;
NvOSD_MaskParams mask_params;
NvOSD_TextParams text_params;
gchar obj_label[MAX_LABEL_SIZE];
NvDsClassifierMetaList *classifier_meta_list;
NvDsUserMetaList *obj_user_meta_list;
gint64 misc_obj_info[MAX_USER_FIELDS];
gint64 reserved[MAX_RESERVED_FIELDS];
}NvDsObjectMeta;
typedef struct _NvDsFrameMeta {
NvDsBaseMeta base_meta;
guint pad_index;
guint batch_id;
gint frame_num;
guint64 buf_pts;
guint64 ntp_timestamp;
guint source_id;
gint num_surfaces_per_frame;
guint source_frame_width;
guint source_frame_height;
guint surface_type;
guint surface_index;
guint num_obj_meta;
gboolean bInferDone;
NvDsObjectMetaList *obj_meta_list;
NvDisplayMetaList *display_meta_list;
NvDsUserMetaList *frame_user_meta_list;
gint64 misc_frame_info[MAX_USER_FIELDS];
gint64 reserved[MAX_RESERVED_FIELDS];
} NvDsFrameMeta;
deestream_lpr_app.c
...
//获取结果
for (l_frame = batch_meta->frame_meta_list; l_frame != NULL;
l_frame = l_frame->next) {
NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
int offset = 0;
if (!frame_meta)
continue;
for (l_obj = frame_meta->obj_meta_list; l_obj != NULL;
l_obj = l_obj->next) {
obj_meta = (NvDsObjectMeta *) (l_obj->data); //检测的结果
float left = obj_meta->rect_params.left;
float top = obj_meta->rect_params.top;
float right = left + obj_meta->rect_params.width;
float bottom = top + obj_meta->rect_params.height;
float confidence = obj_meta->confidence;
g_print ("%s 0.0 0 0.0 %f %f %f %f 0.0 0.0 0.0 0.0 0.0 0.0 0.0 %f\n",
obj_meta->obj_label, left, top, right, bottom, confidence);
if (!obj_meta)
continue;
/* Check that the object has been detected by the primary detector
* and that the class id is that of vehicles/persons. */
if (obj_meta->unique_component_id == PRIMARY_DETECTOR_UID) { //第一个检测网络的结果
if (obj_meta->class_id == PGIE_CLASS_ID_VEHICLE) //检测到车,第0类
vehicle_count++;
g_print ("zl\n");
g_print ("zl car confidence = %f\n", obj_meta->tracker_confidence); //confidence和tracker_confidence都是-0.1000
if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) //检测到人,第二类
person_count++;
g_print ("zl\n");
g_print ("zl person confidence = %f\n", obj_meta->tracker_confidence); //confidence一直是-0.100,换成tracker_confidence正常了
}
if (obj_meta->unique_component_id == SECONDARY_DETECTOR_UID) { //第二个网络检测的结果
if (obj_meta->class_id == SGIE_CLASS_ID_LPD) { //检测到车牌,第0类
lp_count++;
g_print ("zl\n");
g_print ("zl lpd confidence = %f\n", obj_meta->confidence); //confidence正常
/* Print this info only when operating in secondary model. */
if (obj_meta->parent) //obj_meta->parent还是NvDsObjectMeta类,猜测应该是之前检测到的结果
g_print ("License plate found for parent object %p (type=%s)\n",
obj_meta->parent, pgie_classes_str[obj_meta->parent->class_id]);
obj_meta->text_params.set_bg_clr = 1;
obj_meta->text_params.text_bg_clr.red = 0.0;
obj_meta->text_params.text_bg_clr.green = 0.0;
obj_meta->text_params.text_bg_clr.blue = 0.0;
obj_meta->text_params.text_bg_clr.alpha = 0.0;
obj_meta->text_params.font_params.font_color.red = 1.0;
obj_meta->text_params.font_params.font_color.green = 1.0;
obj_meta->text_params.font_params.font_color.blue = 0.0;
obj_meta->text_params.font_params.font_color.alpha = 1.0;
obj_meta->text_params.font_params.font_size = 12;
}
}
for (l_class = obj_meta->classifier_meta_list; l_class != NULL;
l_class = l_class->next) {
class_meta = (NvDsClassifierMeta *)(l_class->data);
if (!class_meta)
continue;
if (class_meta->unique_component_id == SECONDARY_CLASSIFIER_UID) {
for ( label_i = 0, l_label = class_meta->label_info_list; //第二个检测器lpd有目标时
label_i < class_meta->num_labels && l_label; label_i++,
l_label = l_label->next) {
label_info = (NvDsLabelInfo *)(l_label->data);
if (label_info) {
if (label_info->label_id == 0 && label_info->result_class_id == 1) {
g_print ("Plate License %s\n",label_info->result_label);
}
}
}
}
}
}
display_meta = nvds_acquire_display_meta_from_pool(batch_meta);
NvOSD_TextParams *txt_params = &display_meta->text_params[0];
display_meta->num_labels = 1;
txt_params->display_text = (char*) g_malloc0 (MAX_DISPLAY_LEN);
offset = snprintf(txt_params->display_text, MAX_DISPLAY_LEN,
"Person = %d ", person_count);
offset += snprintf(txt_params->display_text + offset , MAX_DISPLAY_LEN,
"Vehicle = %d ", vehicle_count);
/* Now set the offsets where the string should appear */
txt_params->x_offset = 10;
txt_params->y_offset = 12;
/* Font , font-color and font-size */
char font_n[6];
snprintf(font_n, 6, "Serif");
txt_params->font_params.font_name = font_n;
txt_params->font_params.font_size = 10;
txt_params->font_params.font_color.red = 1.0;
txt_params->font_params.font_color.green = 1.0;
txt_params->font_params.font_color.blue = 1.0;
txt_params->font_params.font_color.alpha = 1.0;
/* Text background color */
txt_params->set_bg_clr = 1;
txt_params->text_bg_clr.red = 0.0;
txt_params->text_bg_clr.green = 0.0;
txt_params->text_bg_clr.blue = 0.0;
txt_params->text_bg_clr.alpha = 1.0;
nvds_add_display_meta_to_frame(frame_meta, display_meta);
}
g_print ("Frame Number = %d Vehicle Count = %d Person Count = %d"
" License Plate Count = %d\n",
frame_number, vehicle_count, person_count,
lp_count);
frame_number++;
total_plate_number += lp_count;
return GST_PAD_PROBE_OK;
}