繁体   English   中英

OpenCV 不会检测到 usb 摄像头,只有 csi 摄像头

[英]OpenCV won't detect usb camera, only csi camera

我一直在使用运行 Ubuntu 的 Jetson。 有两个摄像头连接到它。 使用 gstreamer 和 USB uv(紫外线)相机的 CSI 相机。

我可以很好地检测和运行 CSI 摄像头。 但是每当我尝试连接到 USB 相机时,它要么会抛出错误,要么会尝试连接到 CSI 相机。

这是我尝试让 USB 相机工作的测试代码的最新版本:

import cv2

# Create the capture objects
usb_cap = cv2.VideoCapture(1)

# If they aren't opened correctly
if not usb_cap.isOpened():
    print("Cannot open usb camera")
    exit()

# Set usb477 height and width
usb_cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
usb_cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

# Window
while True:
    # Capture frame-by-frame
    usb_read, usb_frame = usb_cap.read()

    # if frame isn't read correctly
    if not usb_read:
        print("Can't receive frame from usb (stream end?).\nExiting.")
        break

    # Display the resulting frame
    cv2.imshow("USB frame", usb_frame)

    # Escape the loop by pressing 'q'
    if cv2.waitKey(1) == ord('q'):
        break

# When everything done, release the capture
usb_cap.release()
cv2.destroyAllWindows()

运行它会抛出这一系列错误:

[ WARN:0] global /usr/local/src/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0] global /usr/local/src/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (1761) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
[ WARN:0] global /usr/local/src/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (515) startPipeline OpenCV | GStreamer warning: unable to start pipeline
Can't receive frame from usb (stream end?).
Exiting.
[ WARN:0] global /usr/local/src/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created

如果有人至少可以尝试为我指出解决此问题的正确方向,我将不胜感激。

您必须指定 V4L 捕获后端才能使用 V4L 控件。 似乎在这里没有指定它,使用gstreamer后端,它用v4l2src实例化一个管道,但你不能在创建后更改分辨率。

所以最简单的解决方案就是使用 V4L2 捕获后端:

usb_cap = cv2.VideoCapture(1, cv2.CAP_V4L2)

或构建一个 gstreamer 管道,您可以在其中指定大小(最好设置帧速率):

pipeline='v4l2src device=/dev/video1 ! video/x-raw,width=1280,height=720 ! videoconvert ! video/x-raw,format=BGR ! appsink drop=1'
usb_cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM