English | Korean | Chinese | Japanese

APIs: live video

Get a live image

You can obtain a live image using a channel number and sub-stream index.

The default sub-stream index is 0, which represents the primary stream.

🛠️ (frame_image, frame_info) = get_image(ch_no, sub_idx=idx)

↩️ frame_image: numpy array of video image

· For the pixel format "BGR," the shape of the image is (height, width, 3).

↩️ frame_info: dictionary containing information of video image

· frame_info['timestamp']: Unix timestamp

· frame_info['timestamp_msec']: timestamp millisecond

· frame_info['message']: error message

You can also change the video output settings using the following APIs:

🛠️ set_image_size(width, height): Set output video size. (Default: the original video size)

🛠️ set_pixel_format("PIXEL_FORMAT"): Set output video format. You can choose from "RGB" / "BGR" / "0RGB" / "0BGR". (Default: "RGB")

live_video = vmspy.live_video()
if not live_video.init(address, port, access_id, access_pw):
    print(live_video.get_error())

live_video.set_image_size(720, 480)
live_video.set_pixel_format("BGR")
(frame_image, frame_info) = live_video.get_image(1) # ch#1

 

Start live stream and receive video

You can start and stop a live stream using a channel number and sub-stream index.

The default sub-stream index is 0, which represents the primary stream.

🛠️ start(ch_no, sub_idx=idx)

🛠️ stop()

You can also change the video output with the following APIs.

🛠️ set_image_size(width, height): Set output video size. (Default: the original video size)

🛠️ set_pixel_format("PIXEL_FORMAT"): Set output video format. You can choose from "RGB" / "BGR" / "0RGB" / "0BGR". (Default: "RGB")

🛠️ set_keyframe_only(Bool): Set whether to send only iFrames. (Default: False)

live_video.set_image_size(720, 480)
live_video.set_pixel_format("BGR")
live_video.set_keyframe_only(True)
live_video.start(1) # ch#1
# ...
live_video.stop()

Once started, you can receive video streams.

🛠️ (frame_image, frame_info) = get_frame(): Receive video image and information.

↩️ frame_image: numpy array of video image

· For the pixel format "BGR," the shape of the image is (height, width, 3).

↩️ frame_info: dictionary containing information of video image

· frame_info['timestamp']: Unix timestamp

· frame_info['timestamp_msec']: timestamp millisecond

· frame_info['delay']: delayed seconds

· frame_info['buffer_count']: buffered frame count

· frame_info['message']: error message

live_video.start(1) # ch#1
while True:
    (frame_image, frame_info) = live_video.get_frame()
    if frame_image.size == 0:
        print(frame_info['message'])
        break
    # Do analysis
    # Reports detection results and events

live_video.stop()

 

Report detections and events

As an output of analysis, you can report detections and events back to the VMS server.

🛠️ report_event(frame_info, x, y, w, h, duration, event_type_id, class_id, object_id)

➡️ x, y, w, h: location of the event, values are normalized by width and height respectively

➡️ duration: duration of the event in seconds

➡️ event_type_id: type Id of the event, you can define your custom Id starting from zero(0).

· Predefined system event Id: Motion(-1), Sensor(-2), Mobile(-3), Thermal(-4), Overparking(-5), Leakage(-6)

· Custom events can be configured in config.exe

➡️ class_id: class id of the event from AI detection model

➡️ object_id: object id of the event from AI detection model

The number of detection results is likely to be more than one. So you can input results multiple times and send them.

🛠️ inputDetectionResult(x, y, w, h, class_id, object_id, confidence)

➡️ x, y, w, h: location of event, values are normalized by width and height respectively

➡️ class_id: class id of the event from AI detection model

➡️ object_id: object id of the event from AI detection model

➡️ confidence: confidence of inference

🛠️ sendDetectionResults(frame_info): send the input results with frame information

➡️ frame_info: frame information from get_frame() (needed for timestamp)

for box in results[0].boxes:
    xyxy = box.xyxy[0].tolist()
    class_id = int(box.cls[0].item())
    conf = box.conf[0].item()

    x = xyxy[0]/640.0
    y = xyxy[1]/640.0
    w = (xyxy[2] - xyxy[0])/640.0
    h = (xyxy[3] - xyxy[1])/640.0
    live_video.inputDetectionResult(x, y, w, h, class_id=class_id, object_id=0, confidence=conf)

live_video.sendDetectionResults(frame_info)

 

Change the detection box

You have the option to modify the color, thickness, and caption of detection boxes.

🛠️ set_detection_class(class_names): set the class name dictionary

🛠️ set_detection_box(class_id, border_color, border_thickness): change the color and thickness of boxes

➡️ class_id: if not defined, defined color and thickness is applied to all classes. If defined, it will be only applied to the class.

➡️ border_color: This parameter determines the color of the box stroke. It can be specified using either a color name, such as "red," or a hexadecimal representation, like "#ffff0000."

· For a 6-digit format like "#ffffff," each set of two digits represents the Red, Green, and Blue (RGB) colors respectively.

· In an 8-digit format like "#ff000000," the first two digits indicate the alpha channel for transparency.

· In the case of a 3-digit format like "#fff," it is expanded to a 6-digit equivalent.

➡️ border_thickness: This parameter specifies the thickness of the border stroke, measured in pixels.

live_video.start("vms.address", 3300, 1, 0, "access_id", "access_pw")

class_names = {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', ...}
live_video.set_detection_class(class_names)

live_video.set_detection_box(border_color="black", border_thickness=2)
live_video.set_detection_box(class_id=1, border_color="red")
live_video.set_detection_caption(show_object_id=False, show_class_name=True, show_confidence=False)

 

Draw Guide Shapes

You can draw guide shapes on the video. Please refer to the Draw Guide Shapes section for more details.

🛠️ draw_line(x0, y0, x1, y1, border_thickness, border_color): draw a line

🛠️ draw_rectangle(x, y, w, h, border_thickness, border_color): draw a rectangle

🛠️ draw_ellipse(x, y, w, h, border_thickness, border_color): draw a ellipse

🛠️ draw_polygon(point_array, border_thickness, border_color): draw a polygon

➡️ x, y, w, h, x0, y0, x1, y1: location of the event, values are normalized by width and height respectively

➡️ point_array: An array of tuples, where each tuple represents an x-y coordinate pair.

➡️ border_color: This parameter determines the color of the box stroke. It can be specified using either a color name, such as "red," or a hexadecimal representation, like "#ffff0000."

· For a 6-digit format like "#ffffff," each set of two digits represents the Red, Green, and Blue (RGB) colors respectively.

· In an 8-digit format like "#ff000000," the first two digits indicate the alpha channel for transparency.

· In the case of a 3-digit format like "#fff," it is expanded to a 6-digit equivalent.

➡️ border_thickness: This parameter specifies the thickness of the border stroke, measured in pixels.

vms_video.drawLine(0.342592, 0.273927, 0.177778, 0.003300,
                    border_thickness=4.0, border_color="#FF008000")
vms_video.drawRectangle(0.427783, 0.689699, 0.248139, 0.191559,
                    border_thickness=2.0, border_color="#FF0000FF")
vms_video.drawEllipse(0.427783, 0.689699, 0.248139, 0.191559,
                    border_thickness=2.0, border_color="#FF0000FF")
polygon_points = [(0.337037, 0.326733),
    (0.412963, 0.323432),
    (0.392593, 0.907591),
    (0.161111, 0.904290)]
vms_video.drawPolygon(polygon_points, border_thickness=4.0, border_color="#FFFF0000")