Device Queue Event

This example shows how to use getQueueEvent function in order to be notified when one of the packets from selected streams arrive

Demo

Setup

Please run the install script to download all required dependencies. Please note that this script must be ran from git context, so you have to download the depthai-python repository first and then run the script

git clone https://github.com/luxonis/depthai-python.git
cd depthai-python/examples
python3 install_requirements.py

For additional information, please follow installation guide

Source code

Also available on GitHub

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3

"""
 This example demonstrates use of queue events to block a thread until a message
 arrives to any (of the specified) queue
"""

import cv2
import depthai as dai

# Create pipeline
pipeline = dai.Pipeline()

# Define sources and outputs
camRgb = pipeline.createColorCamera()
camMono = pipeline.createMonoCamera()
xoutRgb = pipeline.createXLinkOut()
xoutMono = pipeline.createXLinkOut()

xoutRgb.setStreamName("rgb")
xoutMono.setStreamName("mono")

# Properties
camRgb.setInterleaved(True)
camRgb.setPreviewSize(300, 300)

# Linking
camRgb.preview.link(xoutRgb.input)
camMono.out.link(xoutMono.input)

# Connect to device and start pipeline
with dai.Device(pipeline) as device:

    # Clear queue events
    device.getQueueEvents()

    while True:
        # Block until a message arrives to any of the specified queues
        queueName = device.getQueueEvent(("rgb", "mono"))

        # Getting that message from queue with name specified by the event
        # Note: number of events doesn't necessarily match number of messages in queues
        # because queues can be set to non-blocking (overwriting) behavior
        message = device.getOutputQueue(queueName).get()

        # Display arrived frames
        if type(message) == dai.ImgFrame:
            cv2.imshow(queueName, message.getCvFrame())

        if cv2.waitKey(1) == ord('q'):
            break

Also available on GitHub

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>

// Inludes common necessary includes for development using depthai library
#include "depthai/depthai.hpp"

int main() {
    // Create pipeline
    dai::Pipeline pipeline;

    // Define sources and outputs
    auto camRgb = pipeline.create<dai::node::ColorCamera>();
    auto camMono = pipeline.create<dai::node::MonoCamera>();
    auto xoutRgb = pipeline.create<dai::node::XLinkOut>();
    auto xoutMono = pipeline.create<dai::node::XLinkOut>();

    xoutRgb->setStreamName("rgb");
    xoutMono->setStreamName("mono");

    // Properties
    camRgb->setInterleaved(true);
    camRgb->setPreviewSize(300, 300);

    // Linking
    camRgb->preview.link(xoutRgb->input);
    camMono->out.link(xoutMono->input);

    // Connect to device and start pipeline
    dai::Device device(pipeline);

    // Clear queue events
    device.getQueueEvents();

    while(true) {
        auto ev = device.getQueueEvent();

        if(ev == "rgb") {
            auto rgb = device.getOutputQueue(ev)->get<dai::ImgFrame>();
            cv::imshow("rgb", rgb->getFrame());
        } else if(ev == "mono") {
            auto mono = device.getOutputQueue(ev)->get<dai::ImgFrame>();
            cv::imshow("mono", mono->getFrame());
        }

        int key = cv::waitKey(1);
        if(key == 'q' || key == 'Q') {
            return 0;
        }
    }
    return 0;
}

Got questions?

We’re always happy to help with code or other questions you might have.