def do_transform_ip(self, buf): success, (width, height) = get_buffer_size(self.srcpad.get_current_caps()) if not success: return Gst.FlowReturn.ERROR with map_gst_buffer(buf, Gst.MapFlags.READ) as mapped: frame = np.ndarray((height, width, self.CHANNELS), buffer=mapped, dtype=np.uint8) result = inference_detector(self.model, frame[..., :3]) if isinstance(result, tuple): bbox_result, segm_result = result else: bbox_result, segm_result = result, None # get class ids and detections as ndarrays class_ids = [ np.full(bbox.shape[0], i, dtype=np.int32) for i, bbox in enumerate(bbox_result) ] class_ids = np.concatenate(class_ids) bboxes = np.vstack(bbox_result) # do thresholding by confidence scores = bboxes[:, -1] inds = scores > self.threshold bboxes = bboxes[inds, :] class_ids = class_ids[inds] # nms bboxes = non_max_suppression_fast(bboxes, self.nms) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(buf)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break for class_id, bbox in zip(class_ids, bboxes): obj_meta = pyds.nvds_acquire_obj_meta_from_pool(batch_meta) obj_meta.class_id = class_id obj_meta.object_id = UNTRACKED_OBJECT_ID obj_meta.confidence = bbox[-1] obj_meta.rect_params.left = bbox[0] obj_meta.rect_params.top = bbox[1] obj_meta.rect_params.width = bbox[2] - bbox[0] obj_meta.rect_params.height = bbox[3] - bbox[1] obj_meta.rect_params.border_width = 2 pyds.nvds_add_obj_meta_to_frame(frame_meta, obj_meta, None) try: l_frame = l_frame.next except StopIteration: break return Gst.FlowReturn.OK
def do_transform_ip(self, buf): success, (width, height) = get_buffer_size(self.srcpad.get_current_caps()) if not success: return Gst.FlowReturn.ERROR with map_gst_buffer(buf, Gst.MapFlags.READ) as mapped: frame = np.ndarray((height, width, self.CHANNELS), buffer=mapped, dtype=np.uint8) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(buf)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break objects_meta = [] l_obj = frame_meta.obj_meta_list while l_obj is not None: try: obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) left_top = (obj_meta.rect_params.left, obj_meta.rect_params.top) right_bottom = (obj_meta.rect_params.left + obj_meta.rect_params.width, obj_meta.rect_params.top + obj_meta.rect_params.height) color = self.bbox_colors[obj_meta.class_id % len(self.bbox_colors)] bbox = BBox(left_top, right_bottom, color) text = None if obj_meta.object_id != UNTRACKED_OBJECT_ID: text = f"{obj_meta.object_id}" objects_meta.append(DisplayedObject(bbox, text)) l_obj = l_obj.next except StopIteration: break try: draw_meta(frame, objects_meta) l_frame = l_frame.next except StopIteration: break refcount = buf.mini_object.refcount buf.mini_object.refcount = 1 with map_gst_buffer(buf, Gst.MapFlags.READ | Gst.MapFlags.WRITE) as mapped: out = np.ndarray((height, width, self.CHANNELS), buffer=mapped, dtype=np.uint8) out[:] = frame buf.mini_object.refcount += refcount - 1 return Gst.FlowReturn.OK
def osd_sink_pad_buffer_probe(pad, info, u_data): # Intiallizing object counter with 0. obj_counter = { PGIE_CLASS_ID_VEHICLE: 0, PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_BICYCLE: 0, PGIE_CLASS_ID_ROADSIGN: 0 } num_rects = 0 global total_cars # explicit mention of the global variable inside the function global x11, x12, x13, x14, x21, x22, x23, x24 # lanes gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break frame_number = frame_meta.frame_num num_rects = frame_meta.num_obj_meta l_obj = frame_meta.obj_meta_list while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) if obj_meta.class_id == PGIE_CLASS_ID_VEHICLE: if obj_meta.rect_params.top >= y1 and obj_meta.rect_params.top <= y2: car_found = 0 for x in gate_list: if x.vehicle_id == obj_meta.object_id: x.frames_list.append(frame_number) x.x_list.append(obj_meta.rect_params.left) x.y_list.append(obj_meta.rect_params.top) x.xc_list.append( int(obj_meta.rect_params.left + (obj_meta.rect_params.width / 2))) x.yc_list.append( int(obj_meta.rect_params.top + (obj_meta.rect_params.height / 2))) x.x_smallest = min(x.x_list) x.x_largest = max(x.x_list) x.y_smallest = min(x.y_list) x.y_largest = max(x.y_list) x_center = int(obj_meta.rect_params.left + (obj_meta.rect_params.width / 2)) y_center = int(obj_meta.rect_params.top + (obj_meta.rect_params.height / 2)) if x_center > min(x13, x23): x.lane.append('fast') elif x_center > min(x12, x22): x.lane.append('medium') elif x_center > min(x11, x21): x.lane.append('slow') else: x.lane.append('shoulder') car_found = 1 break if car_found == 0: frame_temp_list = [] frame_temp_list.append(frame_number) x_temp_list = [] x_temp_list.append(obj_meta.rect_params.left) y_temp_list = [] y_temp_list.append(obj_meta.rect_params.top) xc_temp_list = [] xc_temp_list.append( int(obj_meta.rect_params.left + (obj_meta.rect_params.width / 2))) yc_temp_list = [] yc_temp_list.append( int(obj_meta.rect_params.top + (obj_meta.rect_params.height / 2))) x_center = int(obj_meta.rect_params.left + (obj_meta.rect_params.width / 2)) y_center = int(obj_meta.rect_params.top + (obj_meta.rect_params.height / 2)) lane_temp_list = [] if x_center > min(x13, x23): lane_temp_list.append('fast') elif x_center > min(x12, x22): lane_temp_list.append('medium') elif x_center > min(x11, x21): lane_temp_list.append('slow') else: lane_temp_list.append('shoulder') gate_list.append( Gate(obj_meta.object_id, min(x_temp_list), max(x_temp_list), min(y_temp_list), max(y_temp_list), frame_temp_list, x_temp_list, y_temp_list, xc_temp_list, yc_temp_list, lane_temp_list)) if obj_meta.object_id > total_cars: total_cars = obj_meta.object_id # total cars assigned unique tracing IDs print('Vehicle ID = ', obj_meta.object_id, ', Frame Number = ', frame_number, ', Top X = ', obj_meta.rect_params.left, ', Top Y = ', obj_meta.rect_params.top, ', Width = ', obj_meta.rect_params.width, ', Height = ', obj_meta.rect_params.height) except StopIteration: break obj_counter[obj_meta.class_id] += 1 try: l_obj = l_obj.next except StopIteration: break # Acquiring a display meta object. The memory ownership remains in # the C code so downstream plugins can still access it. Otherwise # the garbage collector will claim it when this probe function exits. display_meta = pyds.nvds_acquire_display_meta_from_pool(batch_meta) display_meta.num_labels = 1 py_nvosd_text_params = display_meta.text_params[0] # Setting display text to be shown on screen # Note that the pyds module allocates a buffer for the string, and the # memory will not be claimed by the garbage collector. # Reading the display_text field here will return the C address of the # allocated string. Use pyds.get_string() to get the string content. py_nvosd_text_params.display_text = "Frame Number={} Number of Objects={} Vehicles in Frame={} Total Objects in Stream={}".format( frame_number, num_rects, obj_counter[PGIE_CLASS_ID_VEHICLE], total_cars) # Now set the offsets where the string should appear py_nvosd_text_params.x_offset = 10 py_nvosd_text_params.y_offset = 12 # Font , font-color and font-size py_nvosd_text_params.font_params.font_name = "Serif" py_nvosd_text_params.font_params.font_size = 10 # set(red, green, blue, alpha); set to White py_nvosd_text_params.font_params.font_color.set(1.0, 1.0, 1.0, 1.0) # Text background color py_nvosd_text_params.set_bg_clr = 1 # set(red, green, blue, alpha); set to Black print(pyds.get_string(py_nvosd_text_params.display_text)) pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) # Draw x11_x21 py_nvosd_line_params = display_meta.line_params[0] py_nvosd_line_params.x1 = x11 py_nvosd_line_params.y1 = y1 py_nvosd_line_params.x2 = x21 py_nvosd_line_params.y2 = y2 py_nvosd_line_params.line_width = 5 py_nvosd_line_params.line_color.set(0.0, 1.0, 0.0, 1.0) display_meta.num_lines = display_meta.num_lines + 1 pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) x11 = py_nvosd_line_params.x1 x21 = py_nvosd_line_params.x2 # Draw x12_x22 py_nvosd_line_params = display_meta.line_params[1] py_nvosd_line_params.x1 = x12 py_nvosd_line_params.y1 = y1 py_nvosd_line_params.x2 = x22 py_nvosd_line_params.y2 = y2 py_nvosd_line_params.line_width = 5 py_nvosd_line_params.line_color.set(0.0, 1.0, 0.0, 1.0) display_meta.num_lines = display_meta.num_lines + 1 pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) x12 = py_nvosd_line_params.x1 x22 = py_nvosd_line_params.x2 # Draw x13_x23 py_nvosd_line_params = display_meta.line_params[2] py_nvosd_line_params.x1 = x13 py_nvosd_line_params.y1 = y1 py_nvosd_line_params.x2 = x23 py_nvosd_line_params.y2 = y2 py_nvosd_line_params.line_width = 5 py_nvosd_line_params.line_color.set(0.0, 1.0, 0.0, 1.0) display_meta.num_lines = display_meta.num_lines + 1 pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) x13 = py_nvosd_line_params.x1 x23 = py_nvosd_line_params.x2 # Draw x14_x24 py_nvosd_line_params = display_meta.line_params[3] py_nvosd_line_params.x1 = x14 py_nvosd_line_params.y1 = y1 py_nvosd_line_params.x2 = x24 py_nvosd_line_params.y2 = y2 py_nvosd_line_params.line_width = 5 py_nvosd_line_params.line_color.set(0.0, 1.0, 0.0, 1.0) display_meta.num_lines = display_meta.num_lines + 1 pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) x14 = py_nvosd_line_params.x1 x24 = py_nvosd_line_params.x2 try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def tiler_src_pad_buffer_probe(pad,info,u_data): frame_number=0 num_rects=0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break # print("Frame Number is ", frame_meta.frame_num) # print("Source id is ", frame_meta.source_id) # print("Batch id is ", frame_meta.batch_id) # print("Source Frame Width ", frame_meta.source_frame_width) # print("Source Frame Height ", frame_meta.source_frame_height) # print("Num object meta ", frame_meta.num_obj_meta) frame_number=frame_meta.frame_num l_obj=frame_meta.obj_meta_list num_rects = frame_meta.num_obj_meta obj_counter = { PGIE_CLASS_ID_VEHICLE:0, PGIE_CLASS_ID_PERSON:0, PGIE_CLASS_ID_BICYCLE:0, PGIE_CLASS_ID_ROADSIGN:0 } while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta=pyds.glist_get_nvds_object_meta(l_obj.data) except StopIteration: break print(obj_meta.object_id) obj_counter[obj_meta.class_id] += 1 try: l_obj=l_obj.next except StopIteration: break # Get frame rate through this probe fps_streams["stream{0}".format(frame_meta.pad_index)].get_fps() try: l_frame=l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def osd_sink_pad_buffer_probe(pad, info, u_data): frame_number = 0 #Intiallizing object counter with 0. obj_counter = { PGIE_CLASS_ID_VEHICLE: 0, PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_BICYCLE: 0, PGIE_CLASS_ID_ROADSIGN: 0 } is_first_object = True gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) if not batch_meta: return Gst.PadProbeReturn.OK l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: continue is_first_object = True ''' print("Frame Number is ", frame_meta.frame_num) print("Source id is ", frame_meta.source_id) print("Batch id is ", frame_meta.batch_id) print("Source Frame Width ", frame_meta.source_frame_width) print("Source Frame Height ", frame_meta.source_frame_height) print("Num object meta ", frame_meta.num_obj_meta) ''' frame_number = frame_meta.frame_num l_obj = frame_meta.obj_meta_list while l_obj is not None: try: obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) except StopIteration: continue # Update the object text display txt_params = obj_meta.text_params if (txt_params.display_text): pyds.free_buffer(txt_params.display_text) txt_params.display_text = pgie_classes_str[obj_meta.class_id] obj_counter[obj_meta.class_id] += 1 # Font , font-color and font-size txt_params.font_params.font_name = "Serif" txt_params.font_params.font_size = 10 # set(red, green, blue, alpha); set to White txt_params.font_params.font_color.set(1.0, 1.0, 1.0, 1.0) # Text background color txt_params.set_bg_clr = 1 # set(red, green, blue, alpha); set to Black txt_params.text_bg_clr.set(0.0, 0.0, 0.0, 1.0) # Ideally NVDS_EVENT_MSG_META should be attached to buffer by the # component implementing detection / recognition logic. # Here it demonstrates how to use / attach that meta data. if (is_first_object and not (frame_number % 30)): # Frequency of messages to be send will be based on use case. # Here message is being sent for first object every 30 frames. # Allocating an NvDsEventMsgMeta instance and getting reference # to it. The underlying memory is not manged by Python so that # downstream plugins can access it. Otherwise the garbage collector # will free it when this probe exits. msg_meta = pyds.alloc_nvds_event_msg_meta() msg_meta.bbox.top = obj_meta.rect_params.top msg_meta.bbox.left = obj_meta.rect_params.left msg_meta.bbox.width = obj_meta.rect_params.width msg_meta.bbox.height = obj_meta.rect_params.height msg_meta.frameId = frame_number msg_meta.trackingId = long_to_int(obj_meta.object_id) msg_meta.confidence = obj_meta.confidence msg_meta = generate_event_msg_meta(msg_meta, obj_meta.class_id) user_event_meta = pyds.nvds_acquire_user_meta_from_pool( batch_meta) if (user_event_meta): user_event_meta.user_meta_data = msg_meta user_event_meta.base_meta.meta_type = pyds.NvDsMetaType.NVDS_EVENT_MSG_META # Setting callbacks in the event msg meta. The bindings layer # will wrap these callables in C functions. Currently only one # set of callbacks is supported. pyds.set_user_copyfunc(user_event_meta, meta_copy_func) pyds.set_user_releasefunc(user_event_meta, meta_free_func) pyds.nvds_add_user_meta_to_frame(frame_meta, user_event_meta) else: print("Error in attaching event meta to buffer\n") is_first_object = False try: l_obj = l_obj.next except StopIteration: break try: l_frame = l_frame.next except StopIteration: break print("Frame Number =", frame_number, "Vehicle Count =", obj_counter[PGIE_CLASS_ID_VEHICLE], "Person Count =", obj_counter[PGIE_CLASS_ID_PERSON]) return Gst.PadProbeReturn.OK
def osd_sink_pad_buffer_probe(pad, info, u_data): frame_number = 0 #Intiallizing object counter with 0. obj_counter = { PGIE_CLASS_ID_VEHICLE: 0, PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_BICYCLE: 0, PGIE_CLASS_ID_ROADSIGN: 0 } num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break frame_number = frame_meta.frame_num num_rects = frame_meta.num_obj_meta l_obj = frame_meta.obj_meta_list while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) except StopIteration: break obj_counter[obj_meta.class_id] += 1 try: l_obj = l_obj.next except StopIteration: break # Acquiring a display meta object. The memory ownership remains in # the C code so downstream plugins can still access it. Otherwise # the garbage collector will claim it when this probe function exits. display_meta = pyds.nvds_acquire_display_meta_from_pool(batch_meta) display_meta.num_labels = 1 py_nvosd_text_params = display_meta.text_params[0] # Setting display text to be shown on screen # Note that the pyds module allocates a buffer for the string, and the # memory will not be claimed by the garbage collector. # Reading the display_text field here will return the C address of the # allocated string. Use pyds.get_string() to get the string content. py_nvosd_text_params.display_text = "Frame Number={} Number of Objects={} Vehicle_count={} Person_count={}".format( frame_number, num_rects, obj_counter[PGIE_CLASS_ID_VEHICLE], obj_counter[PGIE_CLASS_ID_PERSON]) # Now set the offsets where the string should appear py_nvosd_text_params.x_offset = 10 py_nvosd_text_params.y_offset = 12 # Font , font-color and font-size py_nvosd_text_params.font_params.font_name = "Serif" py_nvosd_text_params.font_params.font_size = 10 # set(red, green, blue, alpha); set to White py_nvosd_text_params.font_params.font_color.set(1.0, 1.0, 1.0, 1.0) # Text background color py_nvosd_text_params.set_bg_clr = 1 # set(red, green, blue, alpha); set to Black py_nvosd_text_params.text_bg_clr.set(0.0, 0.0, 0.0, 1.0) # Using pyds.get_string() to get display_text as string print(pyds.get_string(py_nvosd_text_params.display_text)) pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def osd_sink_pad_buffer_probe(self, pad, info, u_data): print("sink pad probe invoked", "pad", pad, "info", info, "info.data", hex(info.data), "hash of get_buffer", hex(hash(info.get_buffer())), "info.get_buffer", info.get_buffer(), "u_data", u_data, "self", self) #pdb.set_trace() #Intiallizing object counter with 0. obj_counter = { PGIE_CLASS_ID_VEHICLE: 0, PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_BICYCLE: 0, PGIE_CLASS_ID_ROADSIGN: 0 } num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) bbox_params_dump_file = None #batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(info.data) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: print("NvDS Meta contained NULL meta") break if self.args.output_kitti is not None: bbox_file = "%s/%06d.txt" % (self.args.output_kitti, self.frame_number) bbox_params_dump_file = open(bbox_file, "w") batch_frame_number = frame_meta.frame_num num_rects = frame_meta.num_obj_meta l_obj = frame_meta.obj_meta_list while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) except StopIteration: print("NvDsObjectMeta Meta contained NULL meta") break obj_counter[obj_meta.class_id] += 1 rect_params = obj_meta.rect_params text_params = obj_meta.text_params if text_params.display_text is not None: text_params.set_bg_clr = 0 text_params.font_params.font_size = 0 # Draw black patch to cover license plates (class_id = 1) if obj_meta.class_id == 1: rect_params.border_width = 0 rect_params.has_bg_color = 1 rect_params.bg_color.set(0.5, 0.0, 0.5, 1.0) #rect_params.bg_color.red = 0.0 #rect_params.bg_color.green = 0.0 #rect_params.bg_color.blue = 0.0 #rect_params.bg_color.alpha = 1.0 # Draw skin-color patch to cover faces (class_id = 0) if obj_meta.class_id == 0: rect_params.border_width = 0 rect_params.has_bg_color = 1 rect_params.bg_color.set(0.92, 0.75, 0.56, 1.0) #rect_params.bg_color.red = 0.92 #rect_params.bg_color.green = 0.75 #rect_params.bg_color.blue = 0.56 #rect_params.bg_color.alpha = 1.0 if bbox_params_dump_file is not None: left = rect_params.left top = rect_params.top right = left + rect_params.width bottom = top + rect_params.height class_index = obj_meta.class_id text = self.pgie_classes_str[obj_meta.class_id] bbox_params_dump_file.write( "%s 0.0 0 0.0 %d.00 %d.00 %d.00 %d.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n" % (text, left, top, right, bottom)) try: l_obj = l_obj.next except StopIteration: print("NvDsObjectMeta next contained NULL meta") break if bbox_params_dump_file is not None: bbox_params_dump_file.close() bbox_params_dump_file = None try: l_frame = l_frame.next except StopIteration: break """ buf = ffi.cast("void *", info.data) gst_meta = lib.gst_buffer_iterate_meta(buf, self.statePtr) while gst_meta != ffi.NULL: print("****got metadata....", gst_meta) if lib.gst_meta_has_tag(gst_meta, self._nvdsmeta_quark): nvdsmeta = ffi.cast("NvDsMeta *", gst_meta) print("*********got deepstream metadata....", nvdsmeta, nvdsmeta.meta_type) # We are interested only in intercepting Meta of type # "NVDS_META_FRAME_INFO" as they are from our infer elements. if nvdsmeta.meta_type == lib.NVDS_META_FRAME_INFO: frame_meta = ffi.cast("NvDsFrameMeta *", nvdsmeta.meta_data) if frame_meta == ffi.NULL: print("NvDS Meta contained NULL meta") self.frame_number += 1 return Gst.PadProbeReturn.OK if self.args.output_kitti is not None: bbox_file = "%s/%06d.txt" % (self.args.output_kitti, self.frame_number) bbox_params_dump_file = open(bbox_file, "w") num_rects = frame_meta.num_rects print("num rects", num_rects) # This means we have num_rects in frame_meta->obj_params, # now lets iterate through them for rect_index in range(0, num_rects): # Now using above information we need to form a color patch that should # be displayed on the original video to cover object of interests for redaction purpose obj_meta = frame_meta.obj_params[rect_index] rect_params = obj_meta.rect_params text_params = obj_meta.text_params if text_params.display_text != ffi.NULL: lib.g_free(text_params.display_text) # Draw black patch to cover license plates (class_id = 1) if obj_meta.class_id == 1: rect_params.border_width = 0 rect_params.has_bg_color = 1 rect_params.bg_color.red = 0.0 rect_params.bg_color.green = 0.0 rect_params.bg_color.blue = 0.0 rect_params.bg_color.alpha = 1.0 # Draw skin-color patch to cover faces (class_id = 0) if obj_meta.class_id == 0: rect_params.border_width = 0 rect_params.has_bg_color = 1 rect_params.bg_color.red = 0.92 rect_params.bg_color.green = 0.75 rect_params.bg_color.blue = 0.56 rect_params.bg_color.alpha = 1.0 if bbox_params_dump_file is not None: left = rect_params.left top = rect_params.top right = left + rect_params.width bottom = top + rect_params.height class_index = obj_meta.class_id text = self.pgie_classes_str[obj_meta.class_id] bbox_params_dump_file.write("%s 0.0 0 0.0 %d.00 %d.00 %d.00 %d.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n" % (text, left, top, right, bottom)) if bbox_params_dump_file is not None: bbox_params_dump_file.close() bbox_params_dump_file = None gst_meta = lib.gst_buffer_iterate_meta(buf, self.statePtr) """ self.frame_number += 1 return Gst.PadProbeReturn.OK
def tiler_src_pad_buffer_probe(pad, info, u_data): frame_number = 0 num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.glist_get_nvds_frame_meta() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.glist_get_nvds_frame_meta(l_frame.data) except StopIteration: break ''' print("Frame Number is ", frame_meta.frame_num) print("Source id is ", frame_meta.source_id) print("Batch id is ", frame_meta.batch_id) print("Source Frame Width ", frame_meta.source_frame_width) print("Source Frame Height ", frame_meta.source_frame_height) print("Num object meta ", frame_meta.num_obj_meta) ''' frame_number = frame_meta.frame_num l_obj = frame_meta.obj_meta_list num_rects = frame_meta.num_obj_meta obj_counter = { PGIE_CLASS_ID_VEHICLE: 0, PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_BICYCLE: 0, PGIE_CLASS_ID_ROADSIGN: 0 } while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta = pyds.glist_get_nvds_object_meta(l_obj.data) except StopIteration: break obj_counter[obj_meta.class_id] += 1 try: l_obj = l_obj.next except StopIteration: break """display_meta=pyds.nvds_acquire_display_meta_from_pool(batch_meta) display_meta.num_labels = 1 py_nvosd_text_params = display_meta.text_params[0] py_nvosd_text_params.display_text = "Frame Number={} Number of Objects={} Vehicle_count={} Person_count={}".format(frame_number, num_rects, vehicle_count, person) py_nvosd_text_params.x_offset = 10; py_nvosd_text_params.y_offset = 12; py_nvosd_text_params.font_params.font_name = "Serif" py_nvosd_text_params.font_params.font_size = 10 py_nvosd_text_params.font_params.font_color.red = 1.0 py_nvosd_text_params.font_params.font_color.green = 1.0 py_nvosd_text_params.font_params.font_color.blue = 1.0 py_nvosd_text_params.font_params.font_color.alpha = 1.0 py_nvosd_text_params.set_bg_clr = 1 py_nvosd_text_params.text_bg_clr.red = 0.0 py_nvosd_text_params.text_bg_clr.green = 0.0 py_nvosd_text_params.text_bg_clr.blue = 0.0 py_nvosd_text_params.text_bg_clr.alpha = 1.0 #print("Frame Number=", frame_number, "Number of Objects=",num_rects,"Vehicle_count=",vehicle_count,"Person_count=",person) pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta)""" print("Frame Number=", frame_number, "Number of Objects=", num_rects, "Vehicle_count=", obj_counter[PGIE_CLASS_ID_VEHICLE], "Person_count=", obj_counter[PGIE_CLASS_ID_PERSON]) # Get frame rate through this probe fps_streams["stream{0}".format(frame_meta.pad_index)].get_fps() try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK