GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan beberapa webcam USB di Linux

Ding ding! Berhasil menemukan yang ini dengan bantuan dari orang-orang baik di #v4l di freenode.

Singkat cerita:v4l2-ctl adalah alat terbaik untuk men-debug masalah kamera USB. Baca semua perintah yang tersedia dan halaman manual, saya janji akan menyenangkan. Menggunakan v4l2-ctl Saya menemukan salah satu kamera saya tidak mendukung mode video terkompresi apa pun. Anda dapat memeriksa mode apa yang didukung kamera Anda dengan menjalankan perintah berikut:

v4l2-ctl -d /dev/video0 --list-formats

Yang seharusnya menampilkan sesuatu seperti ini.

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

Jika satu-satunya format piksel yang dikembalikan adalah "YUYV", "IUYV", "I420", atau "GBRG", Anda hanya dapat menjalankan satu kamera per pengontrol USB* karena format tersebut tidak terkompresi. Menggunakan beberapa webcam yang mendukung MJPEG atau beberapa bentuk kompresi lainnya akan berfungsi dengan baik.

Jika Anda menggunakan OpenCV seperti saya, jangan khawatir jika format piksel default tidak dikompresi karena tampaknya OpenCV default untuk tetap menggunakan kompresi.

**Kecuali Anda puas dengan resolusi 320x240 atau lebih rendah.*


Jawabannya adalah menggunakan modifikasi uvcvideo yang ditulis oleh SwDevRefugee, dan dijelaskan di atas. Dia dan saya telah bekerja sama untuk mendapatkan kode mod'ed yang dikompilasi untuk OpenWrt, dengan sukses. Versi tempat saya menjalankannya adalah OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), pada router tplink wdr3600:

HASIL:Saya dapat menjalankan 3*c270 (logitech) secara bersamaan pada 1280x960 dan 15fps dalam format MJPG, melalui hub usb 2.0. Saya tidak punya c270 keempat untuk dihubungkan, maaf.

Saya juga dapat memiliki 2*c270 dan 1*GEMBIRD 640*480*15fps dengan format YUV, tetapi menambahkan GEMBIRD ke-2 mengarah ke "Tidak dapat memulai penangkapan:Tidak ada ruang tersisa di perangkat" (spasi==bandwidth di sini, karena Anda kenal baik :)). Perhatikan bahwa GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .

Penggunaan CPU dengan 3*c270 cukup masuk akal pada wdr3600:

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

Jika komunitas memberikan reputasi dan dukungan, saya pikir SwDevRefugee bersedia memasukkan kode ke dalam uvc-linux.


Saya melihat driver uvcvideo dan parameter modul quirks=128 diabaikan jika streaming mjpeg dikompresi.

Webcam pilihan saya adalah Logitech C500 dan Logitech C270, dan saya menemukan bahwa gambar yang dihasilkan oleh C500 pada 1280x1024 adalah 100kbytes dan gambar yang dihasilkan oleh C270 pada 1280x960 adalah 200kbytes.

Jika saya menjalankan C270 pada 10fps maka bitrate yang dibutuhkan adalah 10x200000x8 =16Mbit/s. Di Ubuntu 14.04 modul uvcdriver selalu mengalokasikan 196Mbits/s terlepas dari frame rate. Untuk C500 perilakunya sedikit lebih baik, tetapi masih merupakan babi bandwidth.

Saya telah memodifikasi driver uvcvideo sehingga saya dapat memberikan faktor "kompresi" ke driver melalui antarmuka V4L2. Ini adalah "sedikit peretasan" karena saya menggunakan atribut priv di struct v4l2_pix_format untuk menentukan nilainya. Dalam driver itu menghitung ukuran gambar yang tidak terkompresi dan kemudian membaginya dengan faktor kompresi untuk menentukan bandwidth USB yang akan digunakan.

Secara default saya menggunakan faktor kompresi 10 yang memungkinkan margin besar jika kamera menemukan gambar yang sangat sulit untuk dikompres. C270 yang berjalan pada 1280x960 dan 10fps sekarang menggunakan 41Mbit/dtk dan saya dapat dengan mudah menjalankan 4 kamera dalam satu bus.

Jika ada yang tertarik dengan fitur ini maka saya akan mencoba membuat pengelola uvcvideo mempertimbangkan konsep faktor "kompresi".


Linux
  1. Cara Membakar File ISO Ke Drive USB Di Linux Menggunakan Etcher

  2. Bagaimana cara membuka kompresi format file .xz di Linux menggunakan utilitas tar dan xz?

  3. Cara Mengganti Nama Banyak File Bersama di Linux Menggunakan 3 Metode

  1. Debug Linux menggunakan ProcDump

  2. Kembangkan Aplikasi Jaringan untuk ESP8266 menggunakan Mongoose di Linux

  3. Cara Menambahkan Beberapa Rute di Linux Menggunakan Contoh Perintah ip

  1. Cara Memformat Drive USB di Linux

  2. Cara Menginstal Banyak Distribusi Linux pada Satu USB

  3. Popsicle – Beberapa Flasher File USB untuk Linux