Страница 1 из 2
какое устройство - WEB камера?
Добавлено: 13 авг 2018, 10:02
Olej
В разных дистрибутивах + разных версий + на разных моделях камер - натыкаюсь на такую проблему: WEB-камера отображается как
несколько устройств /dev/video*.
Особенно хорошо это заметно, когда по USB подключены 2 камеры:
Код: Выделить всё
[olej@xenix Face_recognition]$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 авг 9 09:44 /dev/video0
crw-rw----+ 1 root video 81, 1 авг 9 09:44 /dev/video1
crw-rw----+ 1 root video 81, 2 авг 9 14:19 /dev/video2
crw-rw----+ 1 root video 81, 3 авг 9 14:19 /dev/video3
Кто из них есть кто?
Код: Выделить всё
[olej@xenix 09]$ lsusb
Bus 001 Device 004: ID 0c45:62f0 Microdia
Bus 001 Device 003: ID 1908:2310 GEMBIRD
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 2101:020f ActionStar
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Вот 1-е 2 позиции здесь - это есть WEB камеры ... вот их инициализация при загрузке:
Код: Выделить всё
[root@xenix dev]# dmesg
...
[ 4.201889] Linux video capture interface: v2.00
[ 4.234152] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2310)
[ 4.234966] uvcvideo 1-7:1.0: Entity type for entity Processing 2 was not initialized!
[ 4.234968] uvcvideo 1-7:1.0: Entity type for entity Camera 1 was not initialized!
[ 4.235105] input: USB2.0 PC CAMERA: USB2.0 PC CAM as /devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/input/input12
[ 4.236132] uvcvideo: Found UVC 1.00 device USB 2.0 Camera (0c45:62f0)
[ 4.246356] uvcvideo 1-8:1.0: Entity type for entity Extension 5 was not initialized!
[ 4.246360] uvcvideo 1-8:1.0: Entity type for entity Extension 4 was not initialized!
[ 4.246361] uvcvideo 1-8:1.0: Entity type for entity Processing 3 was not initialized!
[ 4.246363] uvcvideo 1-8:1.0: Entity type for entity Camera 1 was not initialized!
[ 4.246446] input: USB 2.0 Camera: USB Camera as /devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0/input/input13
[ 4.246526] usbcore: registered new interface driver uvcvideo
[ 4.246526] USB Video Class driver (1.1.1)
...
Это всё особенно актуально при отработке алгоритмов с компьютерным зрением, с OpenCV ... вот здесь:
Open CV (продолжение) ...
Re: какое устройство - WEB камера?
Добавлено: 13 авг 2018, 10:09
Olej
Olej писал(а):
Особенно хорошо это заметно, когда по USB подключены 2 камеры:
[olej@xenix Face_recognition]$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 авг 9 09:44 /dev/video0
crw-rw----+ 1 root video 81, 1 авг 9 09:44 /dev/video1
crw-rw----+ 1 root video 81, 2 авг 9 14:19 /dev/video2
crw-rw----+ 1 root video 81, 3 авг 9 14:19 /dev/video3
Кто здесь есть кто?
Я могу сказать ... по секрету
, что здесь видеокамеры /dev/video0 и /dev/video2, а /dev/video1 и /dev/video3 - это ... "так себе" (это кто?).
Код: Выделить всё
[root@xenix by-path]# pwd
/dev/v4l/by-path
[root@xenix by-path]# ls -l
итого 0
lrwxrwxrwx 1 root root 12 авг 9 09:44 pci-0000:00:1d.7-usb-0:7:1.0-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 авг 9 09:44 pci-0000:00:1d.7-usb-0:7:1.0-video-index1 -> ../../video1
lrwxrwxrwx 1 root root 12 авг 9 09:44 pci-0000:00:1d.7-usb-0:8:1.0-video-index0 -> ../../video2
lrwxrwxrwx 1 root root 12 авг 9 09:44 pci-0000:00:1d.7-usb-0:8:1.0-video-index1 -> ../../video3
Камеры - это те, которые "...index0".
P.S. Это всё безобразие наверняка определяется правилами udev в файлах .rules и сообщениями сокета netlink при подключении камер...
Но как и где это искать?
Re: какое устройство - WEB камера?
Добавлено: 13 авг 2018, 10:37
Olej
Olej писал(а):
Olej писал(а):
Камеры - это те, которые "...index0".
В этом легко убедиться захватом камеры в OpenCV:
Код: Выделить всё
[olej@xenix ~]$ python3
Python 3.6.6 (default, Jul 19 2018, 14:25:17)
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cap = cv2.VideoCapture( 2 )
>>> cv2.__version__
'3.4.1'
>>>
>>> cap.release()
>>> cap = cv2.VideoCapture( 0 )
>>> cap.release()
>>> cap = cv2.VideoCapture( 1 )
VIDEOIO ERROR: V4L: device /dev/video1: Unable to query number of channels
warning: Cannot query video position: status=0 value=-1 duration=-1
(/builddir/build/BUILD/opencv-3.4.1/modules/videoio/src/cap_gstreamer.cpp:952)
>>> cap.release()
>>> cap = cv2.VideoCapture( 3 )
VIDEOIO ERROR: V4L: device /dev/video3: Unable to query number of channels
warning: Cannot query video position: status=0 value=-1 duration=-1
(/builddir/build/BUILD/opencv-3.4.1/modules/videoio/src/cap_gstreamer.cpp:952)
>>> cap.release()
>>> quit()
Причём ... захваченные камеры 1 и 3 (с сообщением ошибки) дают захват
дефаултной камеры (почему то у меня это /dev/video2 ?
) с последующим вводом изображения с неё!
Re: какое устройство - WEB камера?
Добавлено: 13 авг 2018, 10:42
Olej
Olej писал(а):
В этом легко убедиться захватом камеры в OpenCV:
Можно пройтись таким лёгоньким тестом:
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, cv2
from re import search
import commands
video = commands.getoutput( 'ls /sys/class/video4linux' )
print( video )
vPaths = [ os.path.join( '/sys/class/video4linux' + '/' + f + '/' + 'index' ) for f in os.listdir( '/sys/class/video4linux' ) ]
print( vPaths )
vInd = []
for p in vPaths:
with open( p, 'r' ) as f:
vInd.append( f.read().strip() )
print( vInd )
from re import search
vv = []
vd = []
vdict = {}
for dir in os.listdir( '/sys/class/video4linux' ):
with open( '/sys/class/video4linux' + '/' + dir + '/' + 'index', 'r' ) as f:
if f.read().strip() == '0':
vv.append( dir )
dev = int( dir[ ( search( '\d', dir ).start( 0 ) ): ] )
vd.append( dev )
vdict[ dev ] = dir
print( vv )
print( vd )
print( vdict, vdict.keys(), vdict.keys().count( 2 ), vdict.keys().count( 3 ) )
Код: Выделить всё
[olej@xenix Face_recognition]$ python find_video.py
video0
video1
video2
video3
['/sys/class/video4linux/video3/index', '/sys/class/video4linux/video1/index', '/sys/class/video4linux/video2/index', '/sys/class/video4linux/video0/index']
['1', '1', '0', '0']
['video2', 'video0']
[2, 0]
({0: 'video0', 2: 'video2'}, [0, 2], 1, 0)
Re: какое устройство - WEB камера?
Добавлено: 13 авг 2018, 11:19
Olej
Olej писал(а):
Я могу сказать ... по секрету
, что здесь видеокамеры /dev/video0 и /dev/video2, а /dev/video1 и /dev/video3 - это ... "так себе" (это кто?).
Причём, это прекрасно "видят" такие инструменты настройки WEB-камер как
v4l2ucp или
guvcview (
инструменты работы с WEB-камерами).
И я догадываюсь
как они это делают: выполняя соответствующий ioctl() к /dev/video* ...
Но как то же, и простейшим способом, сделать а). из Python и из б). OpenCV на Python?
Re: какое устройство - WEB камера?
Добавлено: 13 авг 2018, 12:36
Olej
Olej писал(а):Но как то же, и простейшим способом, сделать а). из Python и из б). OpenCV на Python?
Интересно, что при указании заведомо неправильного индекса камеры в cv2.VideoCapture() - захватывается
дефаултная камера и всё ОК:
Код: Выделить всё
>>> cap = cv2.VideoCapture( 7 )
VIDEOIO ERROR: V4L: index 7 is not correct!
warning: Cannot query video position: status=0 value=-1 duration=-1
(/builddir/build/BUILD/opencv-3.4.1/modules/videoio/src/cap_gstreamer.cpp:952)
>>> cv2.VideoCapture.isOpened( cap )
True
>>> cap.release()
Или даже так:
Код: Выделить всё
>>> cap = cv2.VideoCapture( -1 )
>>> cv2.VideoCapture.isOpened( cap )
True
>>> ret, frame = cap.read()
>>> ret
True
>>> cap.release()
>>>
>>> cap = cv2.VideoCapture( -5 )
>>> ret, frame = cap.read()
>>> ret
True
>>> cap.release()
Тогда как определить: захвачена ли указанная камера, или дефаултная (по ошибке указания)?
P.S. А вот при таком (явном) указании устройства видеокамеры захват дефаултной камеры не происходит:
Код: Выделить всё
>>> cap = cv2.VideoCapture( '/dev/video4' )
VIDEOIO ERROR: V4L: device /dev/video4: Unable to query number of channels
(python:6118): GStreamer-CRITICAL **: 12:37:32.510: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' failed
GStreamer: Error opening bin: no source element for URI "/dev/video4"
CvCapture_OpenNI::CvCapture_OpenNI : Failed to open input file (/dev/video4): Bad file extension
>>> cv2.VideoCapture.isOpened( cap )
False
>>> cap.release()
Re: какое устройство - WEB камера?
Добавлено: 14 авг 2018, 10:51
Olej
Olej писал(а):
Камеры - это те, которые "...index0".
Смотрю на вот таком
DragonBoard 410c:
Код: Выделить всё
linaro@linaro-alip:~$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 Dec 14 2017 /dev/video0
crw-rw----+ 1 root video 81, 1 Dec 14 2017 /dev/video1
crw-rw----+ 1 root video 81, 2 Dec 14 2017 /dev/video2
linaro@linaro-alip:~$ lsusb
Bus 001 Device 004: ID 046d:082b Logitech, Inc. Webcam C170
Bus 001 Device 007: ID 045e:0750 Microsoft Corp. Wired Keyboard 600
Bus 001 Device 006: ID 046d:c03d Logitech, Inc. M-BT96a Pilot Optical Mouse
Bus 001 Device 005: ID 07a6:8515 ADMtek, Inc. AN8515 Ethernet
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
WEB-камера - одна, а /dev/video* - 3 ...
И такая же история будет на других одноплатных ARM SBC (single-board computer, см.
Rapspberry Pi & Orange Pi).
Вот из-за этой байды и возникла эта тема!
Re: какое устройство - WEB камера?
Добавлено: 14 авг 2018, 10:57
Olej
Olej писал(а):
WEB-камера - одна, а /dev/video* - 3 ...
Сравниваю:
Код: Выделить всё
linaro@linaro-alip:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux testing (buster)
Release: testing
Codename: buster
linaro@linaro-alip:~$ uname -a
Linux linaro-alip 4.14.0-qcomlt-arm64 #1 SMP PREEMPT Fri Feb 2 21:19:01 UTC 2018 aarch64 GNU/Linux
linaro@linaro-alip:~$ lsmod | grep uvcvideo
uvcvideo 94208 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 24576 5 uvcvideo,venus_dec,qcom_camss,venus_enc,v4l2_mem2mem
videobuf2_core 45056 7 uvcvideo,venus_dec,qcom_camss,venus_enc,venus_core,v4l2_mem2mem,videobuf2_v4l2
videodev 196608 8 uvcvideo,venus_dec,qcom_camss,videobuf2_core,venus_enc,venus_core,v4l2_mem2mem,videobuf2_v4l2
media 45056 3 uvcvideo,qcom_camss,videodev
Со стационарным компьютером:
Код: Выделить всё
[olej@xenix ~]$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: Fedora
Description: Fedora release 28 (Twenty Eight)
Release: 28
Codename: TwentyEight
[olej@xenix ~]$ lsmod | grep uvcvideo
uvcvideo 114688 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_common 53248 2 videobuf2_v4l2,uvcvideo
videodev 208896 3 videobuf2_v4l2,uvcvideo,videobuf2_common
media 45056 2 videodev,uvcvideo
О - ба - на
:
qcom_camss !
Re: какое устройство - WEB камера?
Добавлено: 14 авг 2018, 10:59
Olej
Olej писал(а):
О - ба - на
:
qcom_camss !
Код: Выделить всё
linaro@linaro-alip:~$ /sbin/modinfo qcom_camss
filename: /lib/modules/4.14.0-qcomlt-arm64/kernel/drivers/media/platform/qcom/camss-8x16/qcom-camss.ko
license: GPL v2
author: Todor Tomov <todor.tomov@linaro.org>
description: Qualcomm Camera Subsystem driver
alias: platform:qcom-camss
alias: of:N*T*Cqcom,msm8916-camssC*
alias: of:N*T*Cqcom,msm8916-camss
depends: videobuf2-v4l2,videodev,v4l2-fwnode,media,videobuf2-core,videobuf2-dma-sg
intree: Y
name: qcom_camss
vermagic: 4.14.0-qcomlt-arm64 SMP preempt mod_unload aarch64
Это та мезонинная (так они их называют) видеокамера, широкий разъём которой торчит посреди платы на картинке вверху! (предполагаю)
Очень интересно! :
Код: Выделить всё
linaro@linaro-alip:~$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 Dec 14 2017 /dev/video0
crw-rw----+ 1 root video 81, 1 Dec 14 2017 /dev/video1
crw-rw----+ 1 root video 81, 2 Dec 14 2017 /dev/video2
linaro@linaro-alip:/dev/v4l$ pwd
/dev/v4l
linaro@linaro-alip:/dev/v4l$ ls
by-id by-path
linaro@linaro-alip:/dev/v4l$ ls -l by-id
total 0
lrwxrwxrwx 1 root root 12 Dec 14 2017 usb-_Webcam_C170-video-index0 -> ../../video2
linaro@linaro-alip:/dev/v4l$ ls -l by-path
total 0
lrwxrwxrwx 1 root root 12 Dec 14 2017 platform-1d00000.video-codec-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 Dec 14 2017 platform-1d00000.video-codec-video-index1 -> ../../video1
lrwxrwxrwx 1 root root 12 Dec 14 2017 platform-ci_hdrc.0-usb-0:1.1:1.0-video-index0 -> ../../video2
Re: какое устройство - WEB камера?
Добавлено: 14 авг 2018, 11:10
Olej
Olej писал(а):
Это та мезонинная (так они их называют) видеокамера, широкий разъём которой торчит посреди платы на картинке вверху! (предполагаю)
Очень интересно! :
Отключаю WEB-камеру на USB:
Код: Выделить всё
linaro@linaro-alip:/dev/v4l$ lsusb
Bus 001 Device 014: ID 07a6:8515 ADMtek, Inc. AN8515 Ethernet
Bus 001 Device 013: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 012: ID 0603:00f2 Novatek Microelectronics Corp. Keyboard (Labtec Ultra Flat Keyboard)
Bus 001 Device 011: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 010: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
linaro@linaro-alip:/dev/v4l$ dmesg | tail -n4
[ 6337.843052] wlan0: associate with 60:38:e0:f8:a6:e2 (try 1/3)
[ 6337.848856] wlan0: RX AssocResp from 60:38:e0:f8:a6:e2 (capab=0x431 status=0 aid=3)
[ 6337.881105] wlan0: associated
[ 6483.091108] usb 1-1.1: USB disconnect, device number 15
Не-ту...
Код: Выделить всё
linaro@linaro-alip:/dev/v4l$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 Dec 14 2017 /dev/video0
crw-rw----+ 1 root video 81, 1 Dec 14 2017 /dev/video1
Включаю WEB-камеру на USB:
Код: Выделить всё
linaro@linaro-alip:/dev/v4l$ lsusb
Bus 001 Device 014: ID 07a6:8515 ADMtek, Inc. AN8515 Ethernet
Bus 001 Device 013: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 012: ID 0603:00f2 Novatek Microelectronics Corp. Keyboard (Labtec Ultra Flat Keyboard)
Bus 001 Device 011: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 010: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 016: ID 046d:082b Logitech, Inc. Webcam C170
Bus 001 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
linaro@linaro-alip:/dev/v4l$ dmesg | tail -n10
[ 6337.843052] wlan0: associate with 60:38:e0:f8:a6:e2 (try 1/3)
[ 6337.848856] wlan0: RX AssocResp from 60:38:e0:f8:a6:e2 (capab=0x431 status=0 aid=3)
[ 6337.881105] wlan0: associated
[ 6483.091108] usb 1-1.1: USB disconnect, device number 15
[ 6657.139105] usb 1-1.1: new high-speed USB device number 16 using ci_hdrc
[ 6657.349962] uvcvideo: Found UVC 1.00 device Webcam C170 (046d:082b)
[ 6657.357414] uvcvideo 1-1.1:1.0: Entity type for entity Processing 2 was not initialized!
[ 6657.357452] uvcvideo 1-1.1:1.0: Entity type for entity Extension 6 was not initialized!
[ 6657.364664] uvcvideo 1-1.1:1.0: Entity type for entity Camera 1 was not initialized!
[ 6657.372757] input: Webcam C170: Webcam C170 as /devices/platform/soc/78d9000.usb/ci_hdrc.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input12
И ...
Код: Выделить всё
linaro@linaro-alip:/dev/v4l$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 Dec 14 2017 /dev/video0
crw-rw----+ 1 root video 81, 1 Dec 14 2017 /dev/video1
crw-rw----+ 1 root video 81, 2 Aug 13 16:12 /dev/video2
И обращаем внимание на
даты - здесь и текущую:
Код: Выделить всё
linaro@linaro-alip:/dev/v4l$ date
Mon Aug 13 16:12:53 UTC 2018