Я написал программу на 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
Я написал программу на 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 Индекс камеры вне диапазона [list] [*]Обслуживание приложения 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 Индекс камеры вне диапазона [/list] это мой код: ` [code]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
# 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
# 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
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)
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))
[/code] Я немного погуглил, и кто-то посоветовал сделать индекс камеры (-1), а не (0), но это не помогло. я сейчас не знаю, что делать, чтобы это исправить, я бьюсь уже неделю. я использую raspberrypi 5 4 ГБ и полную версию Pi OS