какое устройство - WEB камера?

Обмен опытом по установке Линукс на разные аппаратные конфигурации

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 10:02

В разных дистрибутивах + разных версий + на разных моделях камер - натыкаюсь на такую проблему: 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 (продолжение) ...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 10:09

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
Кто здесь есть кто?
Я могу сказать ... по секрету :lol: , что здесь видеокамеры /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 при подключении камер...
Но как и где это искать?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 10:37

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 ? :-o ) с последующим вводом изображения с неё!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 10:42

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)
Вложения
find_video.py
(932 байт) 136 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 11:19

Olej писал(а): Я могу сказать ... по секрету :lol: , что здесь видеокамеры /dev/video0 и /dev/video2, а /dev/video1 и /dev/video3 - это ... "так себе" (это кто?).
Причём, это прекрасно "видят" такие инструменты настройки WEB-камер как v4l2ucp или guvcview (инструменты работы с WEB-камерами).
И я догадываюсь ;-) как они это делают: выполняя соответствующий ioctl() к /dev/video* ...

Но как то же, и простейшим способом, сделать а). из Python и из б). OpenCV на Python?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 13 авг 2018, 12:36

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()

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 14 авг 2018, 10:51

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).
Вот из-за этой байды и возникла эта тема! :-?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 14 авг 2018, 10:57

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
О - ба - на :lol: :-o : qcom_camss !

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 14 авг 2018, 10:59

Olej писал(а): О - ба - на :lol: :-o : 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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: какое устройство - WEB камера?

Непрочитанное сообщение Olej » 14 авг 2018, 11:10

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
Не-ту... :lol:

Код: Выделить всё

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
И ... :lol:

Код: Выделить всё

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

Ответить

Вернуться в «Железо для Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя