deepstream_lpr_app代码解析

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值