Die Jetson Nano USB-Kamera verwendet openCv, um das Problem mit niedriger Bildrate zu lösen
Als ich kürzlich Jetson Nano spielte, stellte ich fest, dass die Bildrate von openCv beim Öffnen der USB-Kamera nur 5 Bilder betrug, unter Windows jedoch 30 Bilder ausgeführt werden konnten. Ich suchte im Internet nach dem Grund und fand das Standardleseformat der Kamera ist falsch. Ich muss die Bildrate in das MJPG-Format ändern, bevor sie erhöht werden kann. Also habe ich den Code verwendet, den ich auf CSDN gefunden habe, aber nichts davon hat funktioniert. Nachdem ich lange gekämpft hatte, dachte ich plötzlich daran, zu gehen Gehen Sie zu stacoverflow , um einen Blick darauf zu werfen. Ich hatte nicht erwartet, dass es tatsächlich gelöst wurde. Ich werde es hier aufzeichnen.
Überprüfen Sie zunächst, ob das Kameragerät vorhanden ist
1.Installationswerkzeuge
sudo apt install v4l-utils
2. Überprüfen Sie die Kamera
ls /dev/video*
3. Überprüfen Sie die detaillierten Parameter der Kamera, um festzustellen, ob sie unterstützt wird
v4l2-ctl --device=/dev/video0 --list-formats-ext
Im Folgenden sind die Parameter meiner Kamera aufgeführt: OpenCV wird standardmäßig im YUYV-Format geöffnet, sodass die Bildrate niedrig ist und nur 5 Bilder beträgt.
Die Bildrate im Standard-Öffnungsmodus. Die Verbindungslösung
zur Referenz-Website ist unten angegeben.
Vollständiger Code
Geben Sie den vollständigen Code ein und testen Sie, ob er verwendet werden kann. Das Maximum beträgt 30 Bilder, da meine Kamera nur 30 Bilder unterstützen kann
import cv2
import time
width = 640
height = 480
gs_pipeline = f"v4l2src device=/dev/video0 io-mode=2 " \
f"! image/jpeg, width={
width}, height={
height}, framerate=30/1, format=MJPG " \
f"! nvv4l2decoder mjpeg=1 " \
f"! nvvidconv " \
f"! video/x-raw, format=BGRx " \
f"! videoconvert " \
f"! video/x-raw, format=BGR " \
f"! appsink drop=1"
cap = cv2.VideoCapture(gs_pipeline, cv2.CAP_GSTREAMER)
# 每0.1S计算一次帧率
t = 0.1
counter = 0
fps = 0
start_time = time.time()
while (True):
ret, frame = cap.read()
img = frame.copy()
# 测帧率
counter += 1
if (time.time() - start_time) > t:
fps = counter / (time.time() - start_time)
fps = str(fps)
counter = 0
start_time = time.time()
cv2.putText(frame, "FPS {0}".format(fps), (10, 30), 1, 1.5, (255, 0, 255), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
Dieser Code ist von entscheidender Bedeutung
gs_pipeline = f"v4l2src device=/dev/video0 io-mode=2 " \
f"! image/jpeg, width={
width}, height={
height}, framerate=30/1, format=MJPG " \
f"! nvv4l2decoder mjpeg=1 " \
f"! nvvidconv " \
f"! video/x-raw, format=BGRx " \
f"! videoconvert " \
f"! video/x-raw, format=BGR " \
f"! appsink drop=1"
Die Erklärung des großen Gottes:
nvvidconv unterstützt kein BGR, sondern nur BGRx (also die Videokonvertierung für BGRx->BGR). Bei Großbuchstaben fehlt auch ein Komma. Schließlich unterstützt Videoconvert nur den Systemspeicher. Daher muss nvvidconv in den Systemspeicher und nicht in den NVMM-Speicher ausgegeben werden.
Die Berechnung der Bildrate basiert auf dem Code im CSDN.
Jetzt können 30 Bilder ausgeführt werden, und fertig!