test pyuvc

This commit is contained in:
2026-05-18 16:09:23 +02:00
parent ae0b7784ac
commit 60eb59fc32
4 changed files with 530 additions and 0 deletions

239
notes/pyuvc_ex2.txt Normal file
View File

@@ -0,0 +1,239 @@
(.venv-mac-uvc) rafalkaczka@Mac-mini-Rafal duck-preview % sudo $(which python) test_pyuvc_ex2.py
[11:11:55] DEBUG Searching CameraSpec(name='HD USB CAMERA', width=1280, height=720, fps=30, test_pyuvc_ex2.py:65
bandwidth_factor=2.0)...
DEBUG Found match by name test_pyuvc_ex2.py:68
DEBUG Found device that mached uid: 20:10 test_pyuvc_ex2.py:69
DEBUG Device info: {'name': 'HD USB CAMERA', 'manufacturer': '4K USB CAMERA', test_pyuvc_ex2.py:69
'serialNumber': '01.00.00', 'idProduct': 791, 'idVendor': 13028,
'device_address': 10, 'bus_number': 20, 'uid': '20:10'}
libusb: info [darwin_detach_kernel_driver] no capture entitlements. may not be able to detach the kernel driver for this device
DEBUG Device '20:10' opended. test_pyuvc_ex2.py:69
DEBUG Capture(name='HD USB CAMERA' manufacturer='4K USB CAMERA' test_pyuvc_ex2.py:69
serialNumber='01.00.00' idProduct=791 idVendor=13028 device_address=10
bus_number=20 uid='20:10') - all camera modes: [CameraMode(width=3840,
height=2160, fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=3840, height=2160, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=3840, height=2160,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=3840, height=2160, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=3840, height=2160,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=3840, height=2160, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1920, height=1080,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1920, height=1080, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1920, height=1080,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1920, height=1080, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1920, height=1080,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1920, height=1080, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2592, height=1944,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2592, height=1944, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2592, height=1944,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2592, height=1944, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2592, height=1944,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2592, height=1944, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2048, height=1536,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2048, height=1536, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2048, height=1536,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2048, height=1536, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=2048, height=1536,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=2048, height=1536, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1600, height=1200,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1600, height=1200, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1600, height=1200,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1600, height=1200, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1600, height=1200,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1600, height=1200, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=960,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=960, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=960,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=960, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=960,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=960, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=720,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=720, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=720,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=720, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1280, height=720,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1280, height=720, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1024, height=768,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1024, height=768, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1024, height=768,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1024, height=768, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=1024, height=768,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=1024, height=768, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=800, height=600,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=800, height=600, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=800, height=600,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=800, height=600, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=800, height=600,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=800, height=600, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=640, height=480,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=640, height=480, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=640, height=480,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=640, height=480, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=640, height=480,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=640, height=480, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=320, height=240,
fps=30, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=320, height=240, fps=25, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=320, height=240,
fps=20, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=320, height=240, fps=15, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=320, height=240,
fps=10, format_native=7, format_name='MJPG', supported=True),
CameraMode(width=320, height=240, fps=5, format_native=7,
format_name='MJPG', supported=True), CameraMode(width=3840, height=2160,
fps=1, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=1920, height=1080, fps=3, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=2592, height=1944,
fps=1, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=2048, height=1536, fps=3, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=1600, height=1200,
fps=3, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=1280, height=960, fps=5, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=1280, height=720,
fps=10, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=1280, height=720, fps=5, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=1024, height=768,
fps=10, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=1024, height=768, fps=5, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=800, height=600,
fps=20, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=800, height=600, fps=15, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=800, height=600,
fps=10, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=800, height=600, fps=5, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=640, height=480,
fps=30, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=640, height=480, fps=25, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=640, height=480,
fps=20, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=640, height=480, fps=15, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=640, height=480,
fps=10, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=640, height=480, fps=5, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=320, height=240,
fps=30, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=320, height=240, fps=25, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=320, height=240,
fps=20, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=320, height=240, fps=15, format_native=3,
format_name='YUY2', supported=False), CameraMode(width=320, height=240,
fps=10, format_native=3, format_name='YUY2', supported=False),
CameraMode(width=320, height=240, fps=5, format_native=3,
format_name='YUY2', supported=False)]
[11:11:56] DEBUG Adding "Auto Exposure Mode" control. test_pyuvc_ex2.py:69
DEBUG Adding "Absolute Exposure Time" control. test_pyuvc_ex2.py:69
DEBUG Adding "Auto Focus" control. test_pyuvc_ex2.py:69
DEBUG Adding "Absolute Focus" control. test_pyuvc_ex2.py:69
DEBUG Adding "Zoom absolute control" control. test_pyuvc_ex2.py:69
DEBUG Adding "Pan control" control. test_pyuvc_ex2.py:69
DEBUG Adding "Tilt control" control. test_pyuvc_ex2.py:69
libusb: warning [darwin_transfer_status] transfer error: device not responding (value = 0xe00002ed)
DEBUG Could not init Tilt control control! test_pyuvc_ex2.py:69
DEBUG Control info: {'display_name': 'Tilt control', 'unit': 'input_terminal', test_pyuvc_ex2.py:69
'control_id': 13, 'bit_mask': 2048, 'offset': 4, 'data_len': 4,
'buffer_len': 8, 'min_val': None, 'max_val': None, 'step': None, 'def_val':
None, 'd_type': <class 'int'>, 'doc': 'Tilt (Absolute) Control.',
'unit_id': 1}
DEBUG Traceback (most recent call last): test_pyuvc_ex2.py:69
File "uvc_bindings.pyx", line 779, in
uvc_bindings.Capture._enumerate_controls
File "../../../pyuvc-source/controls.pxi", line 625, in
uvc_bindings.Control.__init__
File "../../../pyuvc-source/controls.pxi", line 660, in
uvc_bindings.Control._uvc_get
Exception: Error: Input/output error
DEBUG Adding "Backlight Compensation" control. test_pyuvc_ex2.py:69
DEBUG Adding "Brightness" control. test_pyuvc_ex2.py:69
DEBUG Adding "Contrast" control. test_pyuvc_ex2.py:69
DEBUG Adding "Gain" control. test_pyuvc_ex2.py:69
DEBUG Adding "Power Line frequency" control. test_pyuvc_ex2.py:69
DEBUG Adding "Hue" control. test_pyuvc_ex2.py:69
DEBUG Adding "Saturation" control. test_pyuvc_ex2.py:69
DEBUG Adding "Sharpness" control. test_pyuvc_ex2.py:69
DEBUG Adding "Gamma" control. test_pyuvc_ex2.py:69
DEBUG Adding "White Balance temperature" control. test_pyuvc_ex2.py:69
DEBUG Adding "White Balance temperature,Auto" control. test_pyuvc_ex2.py:69
DEBUG Setting mode: CameraMode(width=1280, height=720, fps=30, format_native=7, test_pyuvc_ex2.py:73
format_name='MJPG', supported=True)
DEBUG Negotiated frame format: {'bmHint': 1, 'bFormatIndex': 1, 'bFrameIndex': 7, test_pyuvc_ex2.py:73
'dwFrameInterval': 333333, 'wKeyFrameRate': 0, 'wPFrameRate': 0,
'wCompQuality': 47, 'wCompWindowSize': 0, 'wDelay': 0,
'dwMaxVideoFrameSize': 1843200, 'dwMaxPayloadTransferSize': 3060,
'dwClockFrequency': 48000000, 'bmFramingInfo': 0, 'bPreferredVersion': 0,
'bMinVersion': 0, 'bMaxVersion': 0, 'bInterfaceNumber': 1}
DEBUG Stream start. test_pyuvc_ex2.py:36
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
libusb: warning [darwin_abort_transfers] aborting all transactions on interface 1 pipe 1
[11:13:41] DEBUG Stream stopped test_pyuvc_ex2.py:61
DEBUG Stream closed test_pyuvc_ex2.py:61
DEBUG Stream stop. test_pyuvc_ex2.py:61
libusb: error [do_close] Device handle closed while transfer was still being processed, but the device is still connected as far as we know
libusb: error [do_close] A cancellation hasn't even been scheduled on the transfer for which the device is closing
[11:13:42] DEBUG UVC device closed.

140
test_opencv.py Normal file
View File

@@ -0,0 +1,140 @@
import cv2
import time
import sys
# =========================
# Otwieranie kamery
# =========================
cap = cv2.VideoCapture(0, cv2.CAP_AVFOUNDATION)
# Na macOS warto wymusić AVFoundation
# cap = cv2.VideoCapture(0, cv2.CAP_AVFOUNDATION)
if not cap.isOpened():
print("Nie można otworzyć kamery")
exit()
ret, frame = cap.read()
if not ret:
print("nie ma obrazu")
cap.release()
cv2.destroyAllWindows()
sys.exit(0)
print(f"{cap.get(cv2.CAP_PROP_BRIGHTNESS)}")
print(f"{cap.get(cv2.CAP_PROP_CONTRAST)}")
print(f"{cap.get(cv2.CAP_PROP_SATURATION)}")
print(f"{cap.get(cv2.CAP_PROP_HUE)}")
print(f"{cap.get(cv2.CAP_PROP_GAIN)}")
print(f"{cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)}")
print(f"{cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)}")
print(f"{cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)}")
time.sleep(0.5)
print(f"{cap.set(cv2.CAP_PROP_EXPOSURE, -1)}")
# =========================
# Lista parametrów OpenCV
# =========================
camera_props = {
"BRIGHTNESS": cv2.CAP_PROP_BRIGHTNESS,
"CONTRAST": cv2.CAP_PROP_CONTRAST,
"SATURATION": cv2.CAP_PROP_SATURATION,
"HUE": cv2.CAP_PROP_HUE,
"GAIN": cv2.CAP_PROP_GAIN,
"EXPOSURE": cv2.CAP_PROP_EXPOSURE,
"SHARPNESS": getattr(cv2, "CAP_PROP_SHARPNESS", -1),
"GAMMA": getattr(cv2, "CAP_PROP_GAMMA", -1),
"AUTO_EXPOSURE": getattr(cv2, "CAP_PROP_AUTO_EXPOSURE", -1),
"WB_TEMPERATURE": getattr(cv2, "CAP_PROP_WB_TEMPERATURE", -1),
}
# =========================
# Okno i suwaki
# =========================
cv2.namedWindow("camera")
def nothing(x):
pass
# Zakresy są orientacyjne
cv2.createTrackbar("brightness", "camera", 128, 255, nothing)
cv2.createTrackbar("contrast", "camera", 128, 255, nothing)
cv2.createTrackbar("saturation", "camera", 128, 255, nothing)
cv2.createTrackbar("hue", "camera", 128, 255, nothing)
cv2.createTrackbar("gain", "camera", 0, 255, nothing)
cv2.createTrackbar("exposure", "camera", 0, 255, nothing)
# =========================
# Pętla główna
# =========================
while True:
try:
# Odczyt suwaków
brightness = cv2.getTrackbarPos("brightness", "camera")
contrast = cv2.getTrackbarPos("contrast", "camera")
saturation = cv2.getTrackbarPos("saturation", "camera")
hue = cv2.getTrackbarPos("hue", "camera")
gain = cv2.getTrackbarPos("gain", "camera")
exposure = cv2.getTrackbarPos("exposure", "camera")
# Ustawianie parametrów
print(f"{cap.set(cv2.CAP_PROP_BRIGHTNESS, brightness / 255.0)}")
print(f"{cap.set(cv2.CAP_PROP_CONTRAST, contrast / 255.0)}")
print(f"{cap.set(cv2.CAP_PROP_SATURATION, saturation / 255.0)}")
print(f"{cap.set(cv2.CAP_PROP_HUE, hue / 255.0)}")
print(f"{cap.set(cv2.CAP_PROP_GAIN, gain / 255.0)}")
# Exposure często wymaga innych wartości
# cap.set(cv2.CAP_PROP_EXPOSURE, float(exposure))
# Odczyt klatki
ret, frame = cap.read()
if not ret:
print("Błąd odczytu obrazu")
break
# Wyświetlanie aktualnych wartości REALNIE ustawionych
y = 20
for name, prop in camera_props.items():
if prop == -1:
continue
value = cap.get(prop)
text = f"{name}: {value:.3f}"
cv2.putText(
frame,
text,
(10, y),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(0, 255, 0),
1
)
y += 20
cv2.imshow("camera", frame)
key = cv2.waitKey(1)
# ESC kończy
if key == 27:
break
except Exception:
print(f"exp:")
finally:
cap.release()
cv2.destroyAllWindows()
# =========================
# Sprzątanie
# =========================
cap.release()
cv2.destroyAllWindows()

48
test_pyuvc_ex1.py Normal file
View File

@@ -0,0 +1,48 @@
import logging
from rich import print
from rich.logging import RichHandler
def main():
import uvc
devices = uvc.device_list()
print("Available devices", devices)
for device in devices:
try:
cap = uvc.Capture(device["uid"])
except uvc.DeviceNotFoundError:
continue
print(f"{cap.name}")
print("Available modes:")
for mode in cap.available_modes:
print(
f"MODE: {mode.width} x {mode.height} @ {mode.fps} ({mode.format_name})"
)
print("Iterating over frame sizes and rates")
for res in cap.frame_sizes:
cap.frame_size = res
for rate in cap.frame_rates:
cap.frame_rate = rate
print(f"RES/RATE: {res[0]} x {res[1]} @ {rate} Hz")
cap.close()
if __name__ == "__main__":
# import os
# os.environ["LIBUSB_DEBUG"] = "0"
logging.basicConfig(
level=logging.NOTSET,
handlers=[RichHandler(level="WARNING")],
format="%(message)s",
datefmt="[%X]",
)
main()

103
test_pyuvc_ex2.py Normal file
View File

@@ -0,0 +1,103 @@
import logging
import os
import time
from typing import Iterable, NamedTuple, Optional
import cv2
import uvc.uvc_bindings as uvc
from rich.logging import RichHandler
from rich.traceback import install as install_rich_traceback
class CameraSpec(NamedTuple):
name: str
width: int
height: int
fps: int
bandwidth_factor: float = 2.0
def main(camera_specs: Iterable[CameraSpec]):
devices = uvc.device_list()
cameras = {spec: init_camera_from_list(devices, spec) for spec in camera_specs}
if not all(cameras.values()):
raise RuntimeError(
"Could not initialize all specified cameras. Available: "
f"{[dev['name'] for dev in devices]}"
)
try:
keep_running = True
last_update = time.perf_counter()
while keep_running:
for spec, cam in cameras.items():
try:
frame = cam.get_frame(timeout=0.001)
except TimeoutError:
pass
# keep_running = False
# break
except uvc.InitError as err:
logging.debug(f"Failed to init {spec}: {err}")
keep_running = False
break
except uvc.StreamError as err:
logging.debug(f"Failed to get a frame for {spec}: {err}")
else:
data = frame.bgr if hasattr(frame, "bgr") else frame.gray
if frame.data_fully_received:
cv2.imshow(spec.name, data)
if (time.perf_counter() - last_update) > 1 / 60:
if cv2.waitKey(1) & 0xFF == 27:
break
last_update = time.perf_counter()
except KeyboardInterrupt:
pass
for cam in cameras.values():
cam.close()
def init_camera_from_list(devices, camera: CameraSpec) -> Optional[uvc.Capture]:
logging.debug(f"Searching {camera}...")
for device in devices:
if device["name"] == camera.name:
logging.debug(f"Found match by name")
capture = uvc.Capture(device["uid"])
capture.bandwidth_factor = camera.bandwidth_factor
for mode in capture.available_modes:
if mode[:3] == camera[1:4]: # compare width, height, fps
capture.frame_mode = mode
return capture
else:
logging.warning(
f"None of the available modes matched: {capture.available_modes}"
)
capture.close()
else:
logging.warning(f"No matching camera with name {camera.name!r} found")
if __name__ == "__main__":
os.environ["LIBUSB_DEBUG"] = "3"
install_rich_traceback()
logging.basicConfig(
level=logging.NOTSET,
handlers=[RichHandler(level="DEBUG")],
format="%(message)s",
datefmt="[%X]",
)
# logging.getLogger("uvc").setLevel("INFO")
main(
[
CameraSpec(
name="HD USB CAMERA",
width=1280,
height=720,
fps=30
)
]
)