Exemple #1
0
    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
Exemple #3
0
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
Exemple #7
0
    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
Exemple #8
0
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