def handle_track_object_meta(obj_meta): if not next((obj for obj in tracked_objects if obj["object_id"] == obj_meta.object_id), None): tracked_objects.append({ "object_id" : obj_meta.object_id, "class_id" : obj_meta.class_id, "object_label" : obj_meta.obj_label, "tracker_confidence" : obj_meta.tracker_confidence, "directions" : [], "" }) # print('Object id: ' + str(obj_meta.object_id)) # print('Class id: ' + str(obj_meta.class_id)) # print('Tracker Confidence: ' + str(obj_meta.tracker_confidence)) # obj_counter[obj_meta.class_id] += 1 l_user_meta = obj_meta.obj_user_meta_list while l_user_meta: try: user_meta = pyds.NvDsUserMeta.cast(l_user_meta.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type("NVIDIA.DSANALYTICSOBJ.USER_META"): user_meta_data = pyds.NvDsAnalyticsObjInfo.cast(user_meta.user_meta_data) if user_meta_data.dirStatus: print("Object {0} moving in direction: {1}".format(obj_meta.object_id, user_meta_data.dirStatus)) if user_meta_data.lcStatus: print("Object {0} line crossing status: {1}".format(obj_meta.object_id, user_meta_data.lcStatus)) if user_meta_data.roiStatus: print("Object {0} roi status: {1}".format(obj_meta.object_id, user_meta_data.roiStatus)) except StopIteration: break try: l_user_meta = l_user_meta.next except StopIteration: break
def nvanalytics_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: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.NvDsFrameMeta.cast() # 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.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break # 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 # } print("#" * 50) while l_obj: try: # Note that l_obj.data needs a cast to pyds.NvDsObjectMeta # The casting is done by pyds.NvDsObjectMeta.cast() obj_meta = pyds.NvDsObjectMeta.cast(l_obj.data) except StopIteration: break # obj_counter[obj_meta.class_id] += 1 l_user_meta = obj_meta.obj_user_meta_list # Extract object level meta data from NvDsAnalyticsObjInfo while l_user_meta: try: user_meta = pyds.NvDsUserMeta.cast(l_user_meta.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSOBJ.USER_META"): user_meta_data = pyds.NvDsAnalyticsObjInfo.cast( user_meta.user_meta_data) if user_meta_data.dirStatus: print("Object {0} moving in direction: {1}".format( obj_meta.object_id, user_meta_data.dirStatus)) if user_meta_data.lcStatus: print( "Object {0} line crossing status: {1}".format( obj_meta.object_id, user_meta_data.lcStatus)) if user_meta_data.ocStatus: print("Object {0} overcrowding status: {1}".format( obj_meta.object_id, user_meta_data.ocStatus)) if user_meta_data.roiStatus: print("Object {0} roi status: {1}".format( obj_meta.object_id, user_meta_data.roiStatus)) except StopIteration: break try: l_user_meta = l_user_meta.next except StopIteration: break try: l_obj = l_obj.next except StopIteration: break # Get meta data from NvDsAnalyticsFrameMeta l_user = frame_meta.frame_user_meta_list while l_user: try: user_meta = pyds.NvDsUserMeta.cast(l_user.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSFRAME.USER_META"): user_meta_data = pyds.NvDsAnalyticsFrameMeta.cast( user_meta.user_meta_data) if user_meta_data.objInROIcnt: print("Objs in ROI: {0}".format( user_meta_data.objInROIcnt)) if user_meta_data.objLCCumCnt: print("Linecrossing Cumulative: {0}".format( user_meta_data.objLCCumCnt)) if user_meta_data.objLCCurrCnt: print("Linecrossing Current Frame: {0}".format( user_meta_data.objLCCurrCnt)) if user_meta_data.ocStatus: print("Overcrowding status: {0}".format( user_meta_data.ocStatus)) except StopIteration: break try: l_user = l_user.next except StopIteration: break # print("Frame Number=", frame_number, "stream id=", frame_meta.pad_index, "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 print("#" * 50) return Gst.PadProbeReturn.OK
def nvanalytics_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: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.NvDsFrameMeta.cast() # 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.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break 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 } print("#"*50) while l_obj: try: # Note that l_obj.data needs a cast to pyds.NvDsObjectMeta # The casting is done by pyds.NvDsObjectMeta.cast() obj_meta=pyds.NvDsObjectMeta.cast(l_obj.data) except StopIteration: break # Set initial colour of bounding box if obj_meta.object_id in obj_color_dict.keys(): r,g,b,a = obj_color_dict[obj_meta.object_id] obj_meta.rect_params.border_color.set(r,g,b,a) else: obj_meta.rect_params.border_color.set(0,1,0,1) obj_counter[obj_meta.class_id] += 1 l_user_meta = obj_meta.obj_user_meta_list # Extract object level meta data from NvDsAnalyticsObjInfo while l_user_meta: try: user_meta = pyds.NvDsUserMeta.cast(l_user_meta.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type("NVIDIA.DSANALYTICSOBJ.USER_META"): user_meta_data = pyds.NvDsAnalyticsObjInfo.cast(user_meta.user_meta_data) # Change colour of bounding box based on # which line is crossed if user_meta_data.lcStatus: print("Object {0} line crossing status: {1}".format(obj_meta.object_id, user_meta_data.lcStatus)) if user_meta_data.lcStatus[0]=='Boundary': obj_color_dict[obj_meta.object_id] = [1,0,0,1] if user_meta_data.lcStatus[0]=='Entry': obj_color_dict[obj_meta.object_id] = [1,1,0,1] if user_meta_data.lcStatus[0]=='Exit': obj_color_dict[obj_meta.object_id] = [0,1,0,1] except StopIteration: break try: l_user_meta = l_user_meta.next except StopIteration: break try: l_obj=l_obj.next except StopIteration: break l_display = frame_meta.display_meta_list while l_display: try: display_meta=pyds.NvDsDisplayMeta.cast(l_display.data) except StopIteration: break # Set text color in each frame for i, text in enumerate(display_meta.text_params): text.font_params.font_color.set(1,1,1,1) # Set line crossing color for i, line in enumerate(display_meta.line_params): if i<4: line.line_color.set(1,0,0,1) else: line.line_color.set(1,1,0,1) try: l_display=l_display.next except StopIteration: break # Get meta data from NvDsAnalyticsFrameMeta l_user = frame_meta.frame_user_meta_list while l_user: try: user_meta = pyds.NvDsUserMeta.cast(l_user.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type("NVIDIA.DSANALYTICSFRAME.USER_META"): user_meta_data = pyds.NvDsAnalyticsFrameMeta.cast(user_meta.user_meta_data) if user_meta_data.objLCCumCnt: print("Linecrossing Cumulative: {0}".format(user_meta_data.objLCCumCnt)) if user_meta_data.objLCCurrCnt: print("Linecrossing Current Frame: {0}".format(user_meta_data.objLCCurrCnt)) except StopIteration: break try: l_user = l_user.next except StopIteration: break print("Frame Number=", frame_number, "stream id=", frame_meta.pad_index, "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 print("#"*50) # Send metadata to flask app url = "http://localhost:5000/updateCount" headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} data = {'boundary_count_curr': user_meta_data.objLCCurrCnt['Boundary'], 'entry_count_curr': user_meta_data.objLCCurrCnt['Entry'], 'exit_count_curr': user_meta_data.objLCCurrCnt['Exit']} r = requests.post(url, data=json.dumps(data), headers=headers) return Gst.PadProbeReturn.OK
def nvanalytics_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 Gst.PadProbeReturn.OK batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list while l_frame: try: frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break l_obj = frame_meta.obj_meta_list while l_obj: try: obj_meta = pyds.NvDsObjectMeta.cast(l_obj.data) except StopIteration: break l_user_meta = obj_meta.obj_user_meta_list while l_user_meta: try: user_meta = pyds.NvDsUserMeta.cast(l_user_meta.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSOBJ.USER_META"): user_meta_data = pyds.NvDsAnalyticsObjInfo.cast( user_meta.user_meta_data) # if user_meta_data.dirStatus: print("Object {0} moving in direction: {1}".format(obj_meta.object_id, user_meta_data.dirStatus)) # if user_meta_data.lcStatus: print("Object {0} line crossing status: {1}".format(obj_meta.object_id, user_meta_data.lcStatus)) except StopIteration: break try: l_user_meta = l_user_meta.next except StopIteration: break try: l_obj = l_obj.next except StopIteration: break l_user = frame_meta.frame_user_meta_list while l_user: try: user_meta = pyds.NvDsUserMeta.cast(l_user.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSFRAME.USER_META"): user_meta_data = pyds.NvDsAnalyticsFrameMeta.cast( user_meta.user_meta_data) if user_meta_data.objLCCumCnt: print("Linecrossing Cumulative: {0}".format( user_meta_data.objLCCumCnt)) # if user_meta_data.objLCCurrCnt: print("Linecrossing Current Frame: {0}".format(user_meta_data.objLCCurrCnt)) except StopIteration: break try: l_user = l_user.next except StopIteration: break try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def tiler_src_pad_buffer_probe(pad, info, u_data): global number_sources frame_number = 0 num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return lp_dict = {i: {} for i in range(number_sources)} # 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.NvDsFrameMeta.cast() # 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.NvDsFrameMeta.cast(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 while l_obj is not None: try: # Casting l_obj.data to pyds.NvDsObjectMeta obj_meta = pyds.NvDsObjectMeta.cast(l_obj.data) except StopIteration: break # print(obj_meta.confidence) l_user_meta = obj_meta.obj_user_meta_list while l_user_meta: try: user_meta = pyds.NvDsUserMeta.cast(l_user_meta.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSOBJ.USER_META"): user_meta_data = pyds.NvDsAnalyticsObjInfo.cast( user_meta.user_meta_data) print("Object {0} line crossing status: {1}".format( obj_meta.object_id, user_meta_data.lcStatus)) # print("Object {0} roi status: {1}".format(obj_meta.object_id, user_meta_data.roiStatus)) # if user_meta_data.dirStatus: print("Object {0} moving in direction: {1}".format(obj_meta.object_id, user_meta_data.dirStatus)) # if user_meta_data.lcStatus: print("Object {0} line crossing status: {1}".format(obj_meta.object_id, user_meta_data.lcStatus)) # if user_meta_data.ocStatus: print("Object {0} overcrowding status: {1}".format(obj_meta.object_id, user_meta_data.ocStatus)) # if user_meta_data.roiStatus: print("Object {0} roi status: {1}".format(obj_meta.object_id, user_meta_data.roiStatus)) l_class = obj_meta.classifier_meta_list # print(l_class) if user_meta_data.lcStatus: while l_class is not None: try: class_meta = pyds.NvDsClassifierMeta.cast( l_class.data) except StopIteration: break l_label = class_meta.label_info_list # print(class_meta.num_labels) while l_label is not None: try: label_info = pyds.NvDsLabelInfo.cast( l_label.data) except StopIteration: break print(label_info.result_label) # print(long_to_int(obj_meta.object_id)) x = obj_meta.rect_params.left y = obj_meta.rect_params.top w = obj_meta.rect_params.width h = obj_meta.rect_params.height lp_dict[frame_meta.pad_index][long_to_int( obj_meta.object_id)] = [ label_info.result_label, obj_meta.confidence, int(x), int(y), int(x + w), int(y + h) ] try: l_label = l_label.next except StopIteration: break try: l_class = l_class.next except StopIteration: break except StopIteration: break try: l_user_meta = l_user_meta.next except StopIteration: break try: l_obj = l_obj.next except StopIteration: break #write image when object detected in "positive" folder for source_id, data in lp_dict.items(): for tracking_id, bbox_info in data.items(): if tracking_id not in list(id_list.queue): if id_list.full(): id_list.get() id_list.put(tracking_id) try: frame = get_frame(gst_buffer, frame_meta.batch_id) name = "img_" + str( tracking_id) + "_" + datetime.datetime.now( ).strftime("%Y%m%d_%H%M%S") + ".jpg" if bbox_info[1] > 0.3: cv2.rectangle(frame, (bbox_info[2], bbox_info[3]), (bbox_info[4], bbox_info[5]), (255, 0, 255), 1) cv2.rectangle(frame, (bbox_info[2], bbox_info[3] - 20), (bbox_info[4], bbox_info[3]), (255, 0, 255), -1) cv2.putText(frame, bbox_info[0], (bbox_info[2], bbox_info[3] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA) cv2.imwrite( os.path.join( os.path.join(path1, "stream_" + str(source_id)), name), frame) print(bbox_info) except cv2.error as e: print(e) print(lp_dict) # Get meta data from NvDsAnalyticsFrameMeta l_user = frame_meta.frame_user_meta_list while l_user: try: user_meta = pyds.NvDsUserMeta.cast(l_user.data) if user_meta.base_meta.meta_type == pyds.nvds_get_user_meta_type( "NVIDIA.DSANALYTICSFRAME.USER_META"): user_meta_data = pyds.NvDsAnalyticsFrameMeta.cast( user_meta.user_meta_data) # if user_meta_data.objInROIcnt: print("Objs in ROI: {0}".format(user_meta_data.objInROIcnt)) if user_meta_data.objLCCumCnt: print("Linecrossing Cumulative: {0}".format( user_meta_data.objLCCumCnt)) # if user_meta_data.objLCCurrCnt: print("Linecrossing Current Frame: {0}".format(user_meta_data.objLCCurrCnt)) # if user_meta_data.ocStatus: print("Overcrowding status: {0}".format(user_meta_data.ocStatus)) except StopIteration: break try: l_user = l_user.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