Browse Source

Add webcam and plot python example

tags/v0.0.0-test.4
haixuanTao 3 years ago
parent
commit
6e034126bd
4 changed files with 115 additions and 0 deletions
  1. +20
    -0
      examples/python-dataflow/dataflow.yml
  2. +49
    -0
      examples/python-dataflow/plot_cv2.py
  3. +1
    -0
      examples/python-dataflow/requirements.txt
  4. +45
    -0
      examples/python-dataflow/webcam_operator.py

+ 20
- 0
examples/python-dataflow/dataflow.yml View File

@@ -0,0 +1,20 @@
communication:
zenoh:
prefix: /example-python-dataflow

nodes:
- id: node-1
operators:
- id: python_webcam
python: webcam_operator.py
inputs:
timer: dora/timer/millis/100
outputs:
- image

- id: node-2
operators:
- id: python_plot
python: plot_cv2.py
inputs:
image: node-1/python_webcam/image

+ 49
- 0
examples/python-dataflow/plot_cv2.py View File

@@ -0,0 +1,49 @@
from enum import Enum
from typing import Callable

import cv2
import numpy as np


class DoraStatus(Enum):
CONTINUE = 0
STOP = 1


class Operator:
"""
Example operator incrementing a counter every times its been called.

The current value of the counter is sent back to dora on `counter`.
"""

def __init__(self):
self.counter = 0

def on_input(
self,
input_id: str,
value: bytes,
send_output: Callable[[str, bytes], None],
) -> DoraStatus:
"""Handle input by incrementing count by one.

Args:
input_id (str): Id of the input declared in the yaml configuration
value (bytes): Bytes message of the input
send_output (Callable[[str, bytes]]): Function enabling sending output back to dora.
"""
self.counter += 1
if input_id == "image":
frame = np.frombuffer(value, dtype="uint8")
frame = np.reshape(frame, (480, 640, 3))
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
return DoraStatus.STOP
if self.counter > 20:
return DoraStatus.STOP
else:
return DoraStatus.CONTINUE

def drop_operator(self):
cv2.destroyAllWindows()

+ 1
- 0
examples/python-dataflow/requirements.txt View File

@@ -0,0 +1 @@
pip install opencv-python

+ 45
- 0
examples/python-dataflow/webcam_operator.py View File

@@ -0,0 +1,45 @@
from enum import Enum
from typing import Callable

import cv2


class DoraStatus(Enum):
CONTINUE = 0
STOP = 1


class Operator:
"""
Example operator incrementing a counter every times its been called.

The current value of the counter is sent back to dora on `counter`.
"""

def __init__(self):
self.video_capture = cv2.VideoCapture(0)

def on_input(
self,
input_id: str,
value: bytes,
send_output: Callable[[str, bytes], None],
) -> DoraStatus:
"""Handle input by incrementing count by one.

Args:
input_id (str): Id of the input declared in the yaml configuration
value (bytes): Bytes message of the input
send_output (Callable[[str, bytes]]): Function enabling sending output back to dora.
"""

ret, frame = self.video_capture.read()
if ret:
send_output("image", frame.tobytes())
else:
print("did not sent video")

return DoraStatus.CONTINUE

def drop_operator(self):
self.video_capture.release()

Loading…
Cancel
Save