Методы интеграции камеры в Linux: OpenCV, Video4Linux, GStreamer и libuvc.

Вот несколько методов работы с камерами в Linux, а также примеры кода:

  1. Библиотека OpenCV.
    OpenCV – это популярная библиотека компьютерного зрения, обеспечивающая обширную поддержку камер. Вот пример захвата видео с камеры с помощью OpenCV в Python:

    import cv2
    # Open the default camera
    cap = cv2.VideoCapture(0)
    while True:
       # Capture frame-by-frame
       ret, frame = cap.read()
       # Display the resulting frame
       cv2.imshow('Camera', frame)
       # Break the loop on 'q' key press
       if cv2.waitKey(1) & 0xFF == ord('q'):
           break
    # Release the camera and close the window
    cap.release()
    cv2.destroyAllWindows()
  2. Video4Linux (V4L):
    Video4Linux — это API ядра, обеспечивающий поддержку устройств видеозахвата. Вы можете использовать пакет v4l-utilsдля взаимодействия с камерами. Вот пример захвата видео с помощью инструмента командной строки v4l2-ctl:

    v4l2-ctl --list-devices           # List available video devices
    v4l2-ctl --device=/dev/video0 --stream-mmap --stream-count=100 --stream-to=output.raw
  3. GStreamer:
    GStreamer — это мультимедийная платформа, поддерживающая захват и обработку данных с камеры. Вот пример захвата видео с помощью инструмента командной строки gst-launch-1.0:

    gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
  4. libuvc:
    libuvc — это кроссплатформенная библиотека для USB-видеоустройств. Вот пример захвата видео с использованием libuvc в C:

    #include <stdio.h>
    #include <libuvc/libuvc.h>
    int main()
    {
       uvc_context_t *ctx;
       uvc_device_t *dev;
       uvc_device_handle_t *devh;
       uvc_stream_ctrl_t ctrl;
       // Initialize the context
       uvc_init(&ctx, NULL);
       // Find the camera
       uvc_find_device(ctx, &dev, 0, 0, NULL);
       // Open the device
       uvc_open(dev, &devh);
       // Start the video stream
       uvc_get_stream_ctrl_format_size(devh, &ctrl, UVC_FRAME_FORMAT_YUYV, 640, 480, 30);
       uvc_start_streaming(devh, &ctrl, NULL);
       // Capture frames
       uvc_frame_t *frame;
       while (1) {
           uvc_stream_ctrl_t ctrl;
           uvc_stream_open_ctrl(devh, &ctrl);
           uvc_stream_get_frame(devh, &frame, 0);
           // Process the frame here
           uvc_stream_close(devh);
       }
    // Stop the video stream
       uvc_stop_streaming(devh);
       // Close the device and release the context
       uvc_close(devh);
       uvc_unref_device(dev);
       uvc_exit(ctx);
       return 0;
    }