Ошибка индекса камеры с cv2 на моем Raspberry PiPython

Программы на Python
Ответить
Anonymous
 Ошибка индекса камеры с cv2 на моем Raspberry Pi

Сообщение Anonymous »

Я написал программу на Python, которая использует yolov5 для обнаружения различных объектов, которые видит камера. Я использую cv2 для передачи потока камеры на yolov5, и на моем ноутбуке все работало хорошо, но когда я разместил код на Raspberry Pi, он больше не работал, и я получаю следующие ошибки:
[ WARN:0@4.921] global cap_v4l.cpp:997 open VIDEOIO(V4L2:/dev/video3): невозможно открыть камеру по индексу
[ERROR:0@4.922] global obsensor_uvc_stream_channel.cpp:159 getStreamChannelGroup Индекс камеры вне диапазона
  • Обслуживание приложения Flask 'test_yolov5'
  • Режим отладки: включен
    4.9.0
    [ WARN:0@4.822] глобальный cap_v4l.cpp:997 open VIDEOIO(V4L2:/dev/video3): невозможно открыть камеру по индексу
    [ERROR:0@4.823] global obsensor_uvc_stream_channel.cpp:159 getStreamChannelGroup Индекс камеры вне диапазона
это мой код:
`

Код: Выделить всё

import cv2
print(cv2.__version__)
from yolov5 import YOLOv5
import numpy as np
from datetime import datetime
from flask import Flask, Response
import atexit
import logging

# Configure logging
logging.basicConfig(
filename='script.log',
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)

app = Flask(__name__)

# Load YOLOv5 model
model_path = '/home/pi/Desktop/02_codeV2/Test/yolov5n.pt'
logging.info("Loading YOLOv5 model from %s", model_path)
model = YOLOv5(model_path, device="cpu")

# Define class labels
PERSON_CLASS = 0
TREE_CLASS = 1

persons_dict, trees_dict, unknown_dict, last_seen = {}, {}, {}, {}

# Start video capture
cap = cv2.VideoCapture(3)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

# Ensure the video capture is released on exit
atexit.register(lambda: (cap.release(), logging.info("Video capture released.")))

def generate_frames():
logging.info("Started video stream generation.")
while cap.isOpened():
ret, frame = cap.read()
if not ret:
logging.warning("Failed to read frame from video capture.")
break

frame = cv2.flip(frame, 1)
original_height, original_width = frame.shape[:2]
small_frame = cv2.resize(frame, (640, 480))

# Perform inference
results = model.predict(small_frame)
detections = results.pandas().xyxy[0]

now = datetime.now()
current_detections = set()
scale_x = original_width / 640
scale_y = original_height / 480

# Log detections
logging.info("Frame processed.  Detected objects: %s", detections.to_dict(orient='records'))

for index, row in detections.iterrows():
x1, y1 = int(row['xmin'] * scale_x), int(row['ymin'] * scale_y)
x2, y2 = int(row['xmax'] * scale_x), int(row['ymax'] * scale_y)
label, pos_x = row['name'], (x1 + x2) / 2

if label == 'person':
color = (0, 255, 0)
key = f'person_{index}'
persons_dict[key] = pos_x
elif label == 'tree':
color = (0, 255, 255)
key = f'tree_{index}'
trees_dict[key] = pos_x
else:
color = (255, 0, 0)
key = f'unknown_{index}'
unknown_dict[key] = pos_x

last_seen[key] = now
current_detections.add(key)
cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)
cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

for obj_dict in [persons_dict, trees_dict, unknown_dict]:
keys_to_remove = [k for k in obj_dict.keys() if k not in current_detections and (now - last_seen[k]).total_seconds() > 1]
for k in keys_to_remove:
del obj_dict[k]
del last_seen[k]
logging.info("Removed %s from tracking due to inactivity.", k)

cv2.putText(frame, now.strftime('%Y-%m-%d %H:%M:%S'), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

_, buffer = cv2.imencode('.jpg', frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')

@app.route('/video_feed')
def video_feed():
return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/')
def index():
return """


YOLOv5 Video Stream


YOLOv5 Video Stream
[img]/video_feed[/img]


"""

if __name__ == '__main__':
import sys
port = int(sys.argv[1]) if len(sys.argv) > 1 else 6234
logging.info("Starting Flask app on port %d.", port)
try:
app.run(host='0.0.0.0', port=port, debug=True)
except Exception as e:
logging.error("Error occurred: %s", str(e))

Я немного погуглил, и кто-то посоветовал сделать индекс камеры (-1), а не (0), но это не помогло. я сейчас не знаю, что делать, чтобы это исправить, я бьюсь уже неделю.
я использую raspberrypi 5 4 ГБ и полную версию Pi OS

Подробнее здесь: https://stackoverflow.com/questions/792 ... spberry-pi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»