Browse Source

make python example usable without webcam

tags/v0.0.0-test.4
haixuanTao 3 years ago
parent
commit
89aa70c9a6
4 changed files with 44 additions and 47 deletions
  1. +23
    -0
      examples/python-dataflow/no_webcam.py
  2. +3
    -3
      examples/python-dataflow/object_detection.py
  3. +2
    -1
      examples/python-dataflow/plot.py
  4. +16
    -43
      examples/python-dataflow/webcam.py

+ 23
- 0
examples/python-dataflow/no_webcam.py View File

@@ -0,0 +1,23 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import urllib.request

import cv2
import numpy as np
from dora import Node

req = urllib.request.urlopen(
"https://pyimagesearch.com/wp-content/uploads/2015/01/opencv_logo.png"
)

arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
node = Node()

start = time.time()

while time.time() - start < 20:
# Wait next input
node.next()
node.send_output("image", arr.tobytes())

+ 3
- 3
examples/python-dataflow/object_detection.py View File

@@ -1,6 +1,7 @@
from enum import Enum
from typing import Callable

import cv2
import numpy as np
import torch

@@ -35,9 +36,8 @@ class Operator:
"""

frame = np.frombuffer(value, dtype="uint8")
frame = np.reshape(frame, (480, 640, 3))[
:, :, ::-1
] # OpenCV image (BGR to RGB)
frame = cv2.imdecode(frame, -1)
frame = frame[:, :, ::-1] # OpenCV image (BGR to RGB)

results = self.model(frame) # includes NMS
arrays = np.array(results.xyxy[0].cpu()).tobytes()


+ 2
- 1
examples/python-dataflow/plot.py View File

@@ -35,8 +35,9 @@ class Operator:
"""
if input_id == "image":
frame = np.frombuffer(value, dtype="uint8")
frame = np.reshape(frame, (480, 640, 3))
frame = cv2.imdecode(frame, -1)
self.image = frame

elif input_id == "bbox" and len(self.image) != 0:
bboxs = np.frombuffer(value, dtype="float32")
bboxs = np.reshape(bboxs, (-1, 6))


+ 16
- 43
examples/python-dataflow/webcam.py View File

@@ -1,50 +1,23 @@
from enum import Enum
from typing import Callable

import cv2


class DoraStatus(Enum):
CONTINUE = 0
STOP = 1
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time

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)
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.
import cv2
from dora import Node

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.
"""
node = Node()

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

self.counter += 1
if self.counter > 100:
return DoraStatus.STOP
start = time.time()

return DoraStatus.CONTINUE
# Run for 20 seconds
while time.time() - start < 20:
# Wait next input
node.next()
ret, frame = video_capture.read()
if ret:
node.send_output("image", cv2.imencode(".jpg", frame)[1].tobytes())

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

Loading…
Cancel
Save