Die Jetson Nano USB-Kamera verwendet openCv, um das Problem mit niedriger Bildrate zu lösen

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.
Kameraparameter anzeigen
Die Bildrate im Standard-Öffnungsmodus. Die Verbindungslösung
Der Standardwert beträgt 5 Frames, bleibt in ppt hängen
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.
Fügen Sie hier eine Bildbeschreibung ein
Jetzt können 30 Bilder ausgeführt werden, und fertig!

Je suppose que tu aimes

Origine blog.csdn.net/qq_37422050/article/details/130614438
conseillé
Classement