Raspberry PiにOpenCV 4.5をインストールする(2021.7.23, 2021.8.7追記)

Summary

Raspbery PiにOpenCVをインストールする。 中の人のサイトによるとpipでインストールするとC++から呼んだりできないのでbuildしてインストールすべきとのこと。
virtualenvを使っている場合のbuildのやり方も解説されているが、ちょうど良いものがなかったのでいくつかのサイトの情報をMixしてインストール用のスクリプトを作成した

Raspberry PiにOpenCVをインストール

中の人が書いたと思われるinstration guideを参考にした

事前準備

Raspberry Piのハードウェアバージョンと、Raspberryのバージョンの確認

Raspberry Pi version

$ cat /proc/device-tree/model
Raspberry Pi 3 B Rev 1.2

$ uname -a
Linux raspberrypi 5.10.17-v7+ #1421 SMP Thu May 27 13:59:01 BST 2021 armv71 GNU/Linux

$ lsb_release -a
No LSB modules are available.
DIstributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

ディスク容量の確認

$ df -h

GPU RAMを128MBに変更

下記のガイドに従ってGPUメモリサイズを128MBに変更

設定の詳細はこちら

Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version

GPUメモリーサイズを変更すると、再起動後に画面の解像度やフォントサイズなどが変な値になっている場合があり、解像度を再設定する必要があった。画面は1280x720, 60Hz

設定の詳細はこちら

Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version Raspberry Pi version

SWAP領域を2GBに拡張

/etc/dphys-swapfileを編集してCONF_SWAPSIZE=2048を追加
CONF_SWAPSIZE=100とあったら#でコメントアウト。

$ cat /etc/dphys-swapfile
$ vim /etc/dphys-swapfile
$ sudo /etc/init.d/dphys-swapfile restart
$ swapon -s

Raspberry Pi version Raspberry Pi version

OpenCVをGlobal installする場合

スクリプトを実行すると~/opencv, ~/opencv_contribが作成され、さらに/usr/local/{lib, include}にライブラリファイルがインストールされる。

pyenvを使っている場合はsystemを選択しておく

事前準備としてGPU RAMサイズとswapサイズを変更しておく
RaspbianではPython 2.7.16とPython 3.7.3がプリインストールされており、numpyも入っている。/usr/bin/python, /usr/bin/python3

$ pyenv global system
$ python --version
$ pip list
$ python3 --version
$ pip3 list
# python 2.7.16の実行ファイルとlibファイルの場所
/usr/bin/python
/usr/lib/python2.7/

# python 3.7.3の実行ファイルとlibファイルの場所
/usr/bin/python3
/usr/lib/python3.7/
/usr/lib/python3/dist-packages/numpy
# site-packagesは存在しない
#/usr/lib/python3/site-packages/<package name>

Installation scriptのダウンロードと実行

virtualenvを使わないのであれば以下で一発インストール可能
このbuildはnumpyに依存しているが、システムに最初からインストールされているので何もしなくて良い。
ただし、pyenvを設定済みの場合はpyenv global systemを実行しておくこと
こちら(OpenCV-4-5-3.sh)を使っても良い

$ pyenv global system
$ mkdir ~/src
$ cd ~/src
$ wget https://github.com/Qengineering/Install-OpenCV-Raspberry-Pi-32-bits/raw/main/OpenCV-4-5-3.sh
$ sudo chmod 755 ./OpenCV-4-5-3.sh
$ ./OpenCV-4-5-3.sh

wgetしたところ

Raspberry Pi version

chmodしてshellスクリプトを実行

Raspberry Pi version

問題なく完了

Raspberry Pi version

このやりかたでinstallするのはsystemに指定されているPythonに対してで、Raspberry PiではPython 2.7とPython 3.7 。Raspberry Pi OSのインストール直後にpyenvを設定しているばあいにはpyenv global systemを忘れずに設定しておく必要がある。そうしないとsystemのPython3を見つけられずPython 2.7にしか紐付けが完了しない。

一連の操作で、opencvのライブラリが/usr/local/{lib, include}にインストールされる。

動作確認

$ pyenv global system
$ python3
>>> import cv2
>>> cv2.__version__
'4.5.3'
>>> print( cv2.getBuildInformation() )

Raspberry Pi version

global uninstallのやりかた

buildディレクトリの中でsudo make uninstallすればよい

$ cd ~/opencv/build
$ sudo make uninstall

念のために/usr/local/libなどにlibopencv*が残っていないことを確認

OpenCVをpyenv virtualenv用に設定する場合

pip install opencv-pythonではうまくいかない(失敗)

virtualenvを使う場合のやりかたも参考にしたサイトに説明がある。
ところで、中の人のサイトではOpenCVをpipではなく自分でbuildすべき理由として、pipでのインストールではヘッダファイルがインストールされないのでC++で利用できないからというのが挙げられていた。
ということは、メインのbuildインストールをしてしまっていれば、ヘッダはあるのでvirtualenvの方を自分でbuildする必要はないと言える。
結論として、素直に以下のようにすればvirtualenv上にインストールできるはずと思ってやってみたが、やはりインストールに失敗した。orz…

$ pyenv virtualenv 3.9.6 3.9.6_opencv
$ pyenv local 3.9.6_opencv
$ pip install opencv-python --> 失敗!

Raspberry Pi version

OpenCVをpyenv virtualenv用にbuildしてみる

下記を参考にやってみる

pyenv virtualenvでPython 3.9.6をインストールし、さらにpyenv virtualenv 3.9.6 3.9.6_cv453としてvirtual環境を構築した場合、site-packageは以下に配置される

# 元になっている3.9.6のpythonの実行ファイルとlibファイルの場所
~/.pyenv/versions/3.9.6/bin/python
~/.pyenv/versions/3.9.6/lib/libpython3.9.a

# 元になっている3.9.6のパッケージの場所 
~/.pyenv/versions/3.9.6/lib/python3.9/site-packages/<package name>

# pyenv virtualenv 3.9.6 3.9.6_cv453として生成した
# 3.9.6_cv453環境のパッケージの場所
~/.pyenv/versions/3.9.6_cv453/lib/python3.9/site-package/<package name>

# ~/.pyenv/versions/3.9.6_cv453の実態は3.9.6/envsへのリンク
~/.pyenv/versions/3.9.6/envs/3.9.6_cv453

作業手順は以下のとおり

  1. OpenCVをインストールする環境をpython globalに設定(さらにactivate)

    Virtualenv環境3.9.6_cv453にインストールする場合

    $ pyenv install 3.9.6
    $ pyenv virtualenv 3.9.6 3.9.6_cv453
    $ pyenv global 3.9.6_cv453
    $ pyenv activate 3.9.6_cv453
  2. pipでnumpyをインストール (without sudo!!!)

    $ pip install numpy

    numpyは以下にインストールされる

    ~/.pyenv/versions/3.9.6_cv453/lib/python3.9/site-package/numpy

    numpyがうまく読めているか確認する

    $ python -V
    3.9.6
    $ python
    >>> import numpy
  3. OpenCV用のshを実行

    依存関係にあるツールのアップデートとソースコードの取得、配置を行うスクリプト
    ~/src/opencv4.5.3の中にopencvとopencv_contribのソースを配置
    get_cv_source.sh

    #!/bin/bash
    # check your memory first
    free -m
    
    echo "Installing OpenCV 4.5.3 on your Raspberry Pi 32-bit OS"
    echo "It will take minimal 1.5 hour !"
    cd ~
    # install the dependencies
    sudo apt-get install -y build-essential cmake git unzip pkg-config gfortran
    sudo apt-get install -y libjpeg-dev libtiff-dev libpng-dev
    sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev
    sudo apt-get install -y libgtk2.0-dev libcanberra-gtk* libgtk-3-dev
    sudo apt-get install -y libxvidcore-dev libx264-dev
    sudo apt-get install -y python3-dev python3-numpy python3-pip
    sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev
    sudo apt-get install -y libv4l-dev v4l-utils
    sudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-dev
    sudo apt-get install -y liblapack-dev gfortran libhdf5-dev
    sudo apt-get install -y libprotobuf-dev libgoogle-glog-dev libgflags-dev
    sudo apt-get install -y protobuf-compiler
    
    # download the latest version
    mkdir ~/src/opencv4.5.3
    cd ~/src/opencv4.5.3
    wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.3.zip
    wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.3.zip
    # unpack
    unzip opencv.zip
    unzip opencv_contrib.zip
    # some administration to make live easier later on
    mv ./opencv-4.5.3 ./opencv
    mv ./opencv_contrib-4.5.3 ./opencv_contrib
    # clean up the zip files
    rm ./opencv.zip
    rm ./opencv_contrib.zip

    gstreamerをONにするなら、忘れずにapt installしておく

    $ sudo apt update
    $sudo apt install cmake libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-tools libgtk2.0-dev gstreamer1.0-omx=1.0.0.1-0+rpi12+jessiepmg gstreamer1.0-plugins-bad gstreamer1.0-plugins-good

    buildディレクトリを掘ってその中でcmake

    $ cd ~/src/opencv4.5.3/
    $ mkdir build

    buildディレクトリの1つ上にcmake_virtualenv.shスクリプトを置いて実行
    ROOTとVENV_ROOT、pythonの場所などを目的に合わせて修正すること
    gstreamerを使わない場合はこちら: cmake_virtualenv3.9.6.sh
    gstreamerを使う場合はこちら  : cmake_virtualenv3.8.11gstreamer.sh

    cmake設定の詳細は下記を参照

    gstreamerをONにするなら、 -D WITH_GSTREAMER=ON \に変更

    gstreamerを使わない例 この例ではPython 3.9.6をvurtualenvで3.9.6_cv453に指定してインストール

    再掲

    $ cd ~/src/test_cv453
    $ pyenv global 3.9.6_cv453
    $ pyenv activate 3.9.6_cv453
    $ pip install numpy
    $ cd ~/src/opencv4.5.3/
    $ mkdir build
    $ cd ~/src/opencv4.5.3/
    $ cmake_virtualenv.sh
    #!/bin/bash
    
    # set path strings
    PYTHON_MAJOR_VERSION=3.9
    ROOT=~/.pyenv/versions/3.9.6
    VENV_ROOT=$ROOT/envs/3.9.6_cv453
    CV_SRC=~/src/opencv4.5.3
    
    cd build
    
    cmake  ${PWD}/../opencv \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=$VENV_ROOT/usr/local/ \
    -D OPENCV_EXTRA_MODULES_PATH=$CV_SRC/opencv_contrib/modules \
    -D PYTHON3_EXECUTABLE=$ROOT/bin/python \
    -D PYTHON_LIBRARY=$ROOT/lib/libpython$PYTHON_MAJOR_VERSION.a \
    -D PYTHON_INCLUDE_DIR=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON_INCLUDE_DIRS=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON_INCLUDE_DIRS2=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D INCLUDE_DIRS=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D INCLUDE_DIRS2=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON3_PACKAGES_PATH=$VENV_ROOT/lib/python$PYTHON_MAJOR_VERSION/site-packages \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$VENV_ROOT/lib/python$PYTHON_MAJOR_VERSION/site-packages/numpy/core/include \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D WITH_OPENMP=ON \
    -D WITH_OPENCL=OFF \
    -D BUILD_ZLIB=ON \
    -D BUILD_TIFF=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_TBB=ON \
    -D BUILD_TBB=ON \
    -D BUILD_TESTS=OFF \
    -D WITH_EIGEN=OFF \
    -D WITH_GSTREAMER=OFF \
    -D WITH_V4L=ON \
    -D WITH_LIBV4L=ON \
    -D WITH_VTK=OFF \
    -D WITH_QT=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D BUILD_opencv_python3=TRUE \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D BUILD_EXAMPLES=OFF ..

    gstreamerを使う例 この例ではPython 3.8.11をvurtualenvで3.8.11_gst453に指定してインストール

    再掲

    $ cd ~/src/test_gst453
    $ pyenv install 3.8.11
    $ pyenv virtualenv 3.8.11 3.8.11_gst453
    $ pyenv global 3.8.11_gst453
    $ pyenv activate 3.8.11_gst453
    $ pip install numpy
    $ cd ~/src/opencv4.5.3/
    $ mkdir build
    $ cd ~/src/opencv4.5.3/
    $ cmake_virtualenv3.8.11gstreamer.sh
    
    #!/bin/bash
    
    # set path strings
    PYTHON_MAJOR_VERSION=3.8
    ROOT=~/.pyenv/versions/3.8.11
    VENV_ROOT=$ROOT/envs/3.8.11_gst453
    CV_SRC=~/src/opencv4.5.3
    
    cd build
    
    # cmake with options
    cmake ${PWD}/../opencv \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=$VENV_ROOT/usr/local/ \
    -D OPENCV_EXTRA_MODULES_PATH=$CV_SRC/opencv_contrib/modules \
    -D PYTHON3_EXECUTABLE=$ROOT/bin/python \
    -D PYTHON_EXECUTABLE=$ROOT/bin/python \
    -D PYTHON_LIBRARY=$ROOT/lib/libpython$PYTHON_MAJOR_VERSION.a \
    -D PYTHON_INCLUDE_DIR=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON_INCLUDE_DIRS=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON_INCLUDE_DIRS2=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D INCLUDE_DIRS=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D INCLUDE_DIRS2=$ROOT/include/python$PYTHON_MAJOR_VERSION \
    -D PYTHON3_PACKAGES_PATH=$VENV_ROOT/lib/python$PYTHON_MAJOR_VERSION/site-packages \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$VENV_ROOT/lib/python$PYTHON_MAJOR_VERSION/site-packages/numpy/core/include \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D WITH_OPENMP=ON \
    -D WITH_OPENCL=OFF \
    -D BUILD_ZLIB=ON \
    -D BUILD_TIFF=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_TBB=ON \
    -D BUILD_TBB=ON \
    -D BUILD_TESTS=OFF \
    -D WITH_EIGEN=OFF \
    -D WITH_GSTREAMER=ON \
    -D WITH_V4L=ON \
    -D WITH_LIBV4L=ON \
    -D WITH_VTK=OFF \
    -D WITH_QT=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D BUILD_opencv_python3=TRUE \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D BUILD_EXAMPLES=OFF ..
    

    buildの中にversion_string.tmpというファイルがあり、その中にインストール先のpython の情報などが記載されているので確認する。

  4. make

    swap領域を2048に増やしているか確認 buildのなかでmake -j4を実行。(Pi3だと5時間、Pi4で1:40かかるらしい)
    失敗したらbuildを全部消してやりなおし。そのときはmake -j1とする

    $ make -j4
  5. install

    $ make install
    $ sudo ldconfig
    $ sudo apt-get update
  6. 確認

    $ python
    >>> import cv2
    >>> cv2.__version__
    '4.5.3'
    >>> print( cv2.getBuildInformation() )
  7. あとしまつ

    buildディレクトリを退避(uninstallするときに必要)

    $ mv ~/opencv4.5/build ~/opencv4.5/build_cs453

    または

    $ mv ~/opencv4.5/build ~/opencv4.5/build_gst453

    /etc/dphys-swapfileを編集してCONF_SWAPSIZE=100に戻す。
    microSDは書き込み回数に制限があるのでswapしすぎると寿命を早めてしまう。

    $ cat /etc/dphys-swapfile
    $ vim /etc/dphys-swapfile
    $ sudo /etc/init.d/dphys-swapfile restart
    $ swapon -s

カメラデバイスからOpenCV経由でキャプチャするテスト

  1. カメラをOnにする

    設定を変更してcamera deviceをONにする

    Raspberry Pi version

    Raspberry Pi version

    再起動が必要
    電源が切れたら電源ケーブルも抜いてカメラデバイスを接続する。
    そして再起動

  2. カメラが接続されているか確認

    vcgencmdコマンドでdetected=1となっていればOK

    $ vcgencmd get_camera
    supported=1 detected=1
  3. pythonからopenCV経由でデバイスを呼び出してみる

    pyenv virtualenvでインストールしたopencvをpythonから呼び出すテスト
    ~/src/test_cv453はpyenv localで3.9.6_cv453(さきほどopencvをインストールしたvenv環境) に設定されているが、cdしてさらにactivateする。(しなくても動くはず)

    $ cd ~/src/test_cv453
    $ pyenv versions
    $ pyenv activate 3.9.6_cv453
    $ ./video_captyre_test3.py

    pythonスクリプトvideo_capture_test3.pyを実行してキャプチャした画像

    Raspberry Pi version

    video_capture_test3.pyの動作中はこんな感じ(赤外線カメラなので色味が変)

    Raspberry Pi version

    使ったカメラはこんなやつ。上に写っているHDMI Video Captureデバイスは、Raspberry PiのHDMI出力をMacでキャプチャするのに使用している。上の2枚の写真もMacでvideo_capture_test2.pyを使ってキャプチャした画像。

    Raspberry Pi version

Gstreamerでキャプチャする

gstreamerでデバイスを確認する方法は以下のとおり(2021.8.7追記)

$ gst-device-monitor-1.0

HDMIキャプチャデバイスを2つUSBポートに刺して実行すると、以下のような情報が表示される。
オーディオデバイスも確認できる。ssh接続だとデバイスモニターを開始できず怒られるらしい。

Probing devices...


Device found:

    name  : Monitor of Built-in Audio Digital Stereo
    class : Audio/Source
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        device.description = "Monitor\ of\ Built-in\ Audio\ Digital\ Stereo"
        device.class = monitor
        alsa.card = 0
        alsa.card_name = "bcm2835\ HDMI\ 1"
        alsa.long_card_name = "bcm2835\ HDMI\ 1"
        alsa.driver_name = snd_bcm2835
        device.bus_path = platform-bcm2835_audio
        sysfs.path = /devices/platform/soc/fe00b840.mailbox/bcm2835_audio/sound/card0
        device.form_factor = internal
        device.string = 0
        module-udev-detect.discovered = 1
        device.icon_name = audio-card
    gst-launch-1.0 pulsesrc device=alsa_output.platform-bcm2835_audio.digital-stereo.monitor ! ...


Device found:

    name  : Monitor of Built-in Audio Analog Stereo
    class : Audio/Source
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        device.description = "Monitor\ of\ Built-in\ Audio\ Analog\ Stereo"
        device.class = monitor
        alsa.card = 1
        alsa.card_name = "bcm2835\ Headphones"
        alsa.long_card_name = "bcm2835\ Headphones"
        alsa.driver_name = snd_bcm2835
        device.bus_path = platform-bcm2835_audio
        sysfs.path = /devices/platform/soc/fe00b840.mailbox/bcm2835_audio/sound/card1
        device.form_factor = internal
        device.string = 1
        module-udev-detect.discovered = 1
        device.icon_name = audio-card
    gst-launch-1.0 pulsesrc device=alsa_output.platform-bcm2835_audio.analog-stereo.monitor ! ...


Device found:

    name  : MYPIN HD Capture Analog Stereo
    class : Audio/Source
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        alsa.resolution_bits = 16
        device.api = alsa
        device.class = sound
        alsa.class = generic
        alsa.subclass = generic-mix
        alsa.name = "USB\ Audio"
        alsa.id = "USB\ Audio"
        alsa.subdevice = 0
        alsa.subdevice_name = "subdevice\ \#0"
        alsa.device = 0
        alsa.card = 2
        alsa.card_name = "MYPIN\ HD\ Capture"
        alsa.long_card_name = "VXIS\ Inc\ MYPIN\ HD\ Capture\ at\ usb-0000:01:00.0-2\,\ super\ speed"
        alsa.driver_name = snd_usb_audio
        device.bus_path = platform-fd500000.pcie-pci-0000:01:00.0-usb-0:2:1.2
        sysfs.path = /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.2/sound/card2
        udev.id = usb-VXIS_Inc_MYPIN_HD_Capture-02
        device.bus = usb
        device.vendor.id = 1bcf
        device.vendor.name = "Sunplus\ Innovation\ Technology\ Inc."
        device.product.id = 2c99
        device.product.name = "MYPIN\ HD\ Capture"
        device.serial = VXIS_Inc_MYPIN_HD_Capture
        device.form_factor = webcam
        device.string = front:2
        device.buffering.buffer_size = 11508
        device.buffering.fragment_size = 2876
        device.access_mode = mmap
        device.profile.name = analog-stereo
        device.profile.description = "Analog\ Stereo"
        device.description = "MYPIN\ HD\ Capture\ Analog\ Stereo"
        alsa.mixer_name = "USB\ Mixer"
        alsa.components = USB1bcf:2c99
        module-udev-detect.discovered = 1
        device.icon_name = camera-web-usb
    gst-launch-1.0 pulsesrc device=alsa_input.usb-VXIS_Inc_MYPIN_HD_Capture-02.analog-stereo ! ...


Device found:

    name  : 2109 Analog Stereo
    class : Audio/Source
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        alsa.resolution_bits = 16
        device.api = alsa
        device.class = sound
        alsa.class = generic
        alsa.subclass = generic-mix
        alsa.name = "USB\ Audio"
        alsa.id = "USB\ Audio"
        alsa.subdevice = 0
        alsa.subdevice_name = "subdevice\ \#0"
        alsa.device = 0
        alsa.card = 3
        alsa.card_name = MS2109
        alsa.long_card_name = "MacroSilicon\ MS2109\ at\ usb-0000:01:00.0-1.1\,\ high\ speed"
        alsa.driver_name = snd_usb_audio
        device.bus_path = platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.2
        sysfs.path = /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.2/sound/card3
        udev.id = usb-MACROSILICON_2109-02
        device.bus = usb
        device.vendor.id = 534d
        device.vendor.name = MACROSILICON
        device.product.id = 2109
        device.product.name = 2109
        device.serial = MACROSILICON_2109
        device.form_factor = webcam
        device.string = front:3
        device.buffering.buffer_size = 11508
        device.buffering.fragment_size = 2876
        device.access_mode = mmap
        device.profile.name = analog-stereo
        device.profile.description = "Analog\ Stereo"
        device.description = "2109\ Analog\ Stereo"
        alsa.mixer_name = "USB\ Mixer"
        alsa.components = USB534d:2109
        module-udev-detect.discovered = 1
        device.icon_name = camera-web-usb
    gst-launch-1.0 pulsesrc device=alsa_input.usb-MACROSILICON_2109-02.analog-stereo ! ...


Device found:

    name  : Built-in Audio Digital Stereo
    class : Audio/Sink
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        alsa.resolution_bits = 16
        device.api = alsa
        device.class = sound
        alsa.class = generic
        alsa.subclass = generic-mix
        alsa.name = "bcm2835\ HDMI\ 1"
        alsa.id = "bcm2835\ HDMI\ 1"
        alsa.subdevice = 0
        alsa.subdevice_name = "subdevice\ \#0"
        alsa.device = 0
        alsa.card = 0
        alsa.card_name = "bcm2835\ HDMI\ 1"
        alsa.long_card_name = "bcm2835\ HDMI\ 1"
        alsa.driver_name = snd_bcm2835
        device.bus_path = platform-bcm2835_audio
        sysfs.path = /devices/platform/soc/fe00b840.mailbox/bcm2835_audio/sound/card0
        device.form_factor = internal
        device.string = hw:0
        device.buffering.buffer_size = 10576
        device.buffering.fragment_size = 2640
        device.access_mode = mmap
        device.profile.name = digital-stereo
        device.profile.description = "Digital\ Stereo"
        device.description = "Built-in\ Audio\ Digital\ Stereo"
        alsa.mixer_name = "Broadcom\ Mixer"
        module-udev-detect.discovered = 1
        device.icon_name = audio-card
    gst-launch-1.0 ... ! pulsesink device=alsa_output.platform-bcm2835_audio.digital-stereo


Device found:

    name  : Built-in Audio Analog Stereo
    class : Audio/Sink
    caps  : audio/x-raw, format=(string){ S16LE, S16BE, F32LE, F32BE, S32LE, S32BE, S24LE, S24BE, S24_32LE, S24_32BE, U8 }, layout=(string)interleaved, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
            audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ];
    properties:
        alsa.resolution_bits = 16
        device.api = alsa
        device.class = sound
        alsa.class = generic
        alsa.subclass = generic-mix
        alsa.name = "bcm2835\ Headphones"
        alsa.id = "bcm2835\ Headphones"
        alsa.subdevice = 0
        alsa.subdevice_name = "subdevice\ \#0"
        alsa.device = 0
        alsa.card = 1
        alsa.card_name = "bcm2835\ Headphones"
        alsa.long_card_name = "bcm2835\ Headphones"
        alsa.driver_name = snd_bcm2835
        device.bus_path = platform-bcm2835_audio
        sysfs.path = /devices/platform/soc/fe00b840.mailbox/bcm2835_audio/sound/card1
        device.form_factor = internal
        device.string = hw:1
        device.buffering.buffer_size = 10576
        device.buffering.fragment_size = 2640
        device.access_mode = mmap
        device.profile.name = analog-stereo
        device.profile.description = "Analog\ Stereo"
        device.description = "Built-in\ Audio\ Analog\ Stereo"
        alsa.mixer_name = "Broadcom\ Mixer"
        module-udev-detect.discovered = 1
        device.icon_name = audio-card
    gst-launch-1.0 ... ! pulsesink device=alsa_output.platform-bcm2835_audio.analog-stereo

Device found:

    name  : UVC Camera (534d:2109): USB Vid
    class : Video/Source
    caps  : video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)5/1;
            video/x-raw, format=(string)YUY2, width=(int)1600, height=(int)1200, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)5/1;
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)1024, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)8/1;
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)960, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)8/1;
            video/x-raw, format=(string)YUY2, width=(int)1360, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)8/1;
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1;
            video/x-raw, format=(string)YUY2, width=(int)1024, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)10/1;
            video/x-raw, format=(string)YUY2, width=(int)800, height=(int)600, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 20/1, 10/1, 5/1 };
            video/x-raw, format=(string)YUY2, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 25/1, 20/1, 10/1, 5/1 };
            video/x-raw, format=(string)YUY2, width=(int)720, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 20/1, 10/1, 5/1 };
            video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1600, height=(int)1200, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1280, height=(int)1024, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1280, height=(int)960, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 50/1, 30/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1360, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 30/1, 25/1, 20/1, 10/1, 5/1 };
            image/jpeg, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
            image/jpeg, width=(int)1024, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
            image/jpeg, width=(int)800, height=(int)600, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
            image/jpeg, width=(int)720, height=(int)576, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
            image/jpeg, width=(int)720, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
            image/jpeg, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 50/1, 30/1, 20/1, 10/1 };
    properties:
        udev-probed = true
        device.bus_path = platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0
        sysfs.path = /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/video4linux/video2
        device.bus = usb
        device.subsystem = video4linux
        device.vendor.id = 534d
        device.vendor.name = MACROSILICON
        device.product.id = 2109
        device.product.name = "UVC\ Camera\ \(534d:2109\):\ USB\ Vid"
        device.serial = MACROSILICON_2109
        device.capabilities = :capture:
        device.api = v4l2
        device.path = /dev/video2
        v4l2.device.driver = uvcvideo
        v4l2.device.card = "UVC\ Camera\ \(534d:2109\):\ USB\ Vid"
        v4l2.device.bus_info = usb-0000:01:00.0-1.1
        v4l2.device.version = 330257 (0x00050a11)
        v4l2.device.capabilities = 2225078273 (0x84a00001)
        v4l2.device.device_caps = 69206017 (0x04200001)
    gst-launch-1.0 v4l2src device=/dev/video2 ! ...


Device found:

    name  : MYPIN HD Capture: MYPIN HD Capt
    class : Video/Source
    caps  : video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1, 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1, 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)1024, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1440, height=(int)900, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1400, height=(int)900, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)960, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1360, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)1024, height=(int)768, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)800, height=(int)600, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
            video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction){ 60/1, 30/1 };
    properties:
        udev-probed = true
        device.bus_path = platform-fd500000.pcie-pci-0000:01:00.0-usb-0:2:1.0
        sysfs.path = /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/video4linux/video0
        device.bus = usb
        device.subsystem = video4linux
        device.vendor.id = 1bcf
        device.vendor.name = "VXIS\\x20Inc"
        device.product.id = 2c99
        device.product.name = "MYPIN\ HD\ Capture:\ MYPIN\ HD\ Capt"
        device.serial = VXIS_Inc_MYPIN_HD_Capture
        device.capabilities = :capture:
        device.api = v4l2
        device.path = /dev/video0
        v4l2.device.driver = uvcvideo
        v4l2.device.card = "MYPIN\ HD\ Capture:\ MYPIN\ HD\ Capt"
        v4l2.device.bus_info = usb-0000:01:00.0-2
        v4l2.device.version = 330257 (0x00050a11)
        v4l2.device.capabilities = 2225078273 (0x84a00001)
        v4l2.device.device_caps = 69206017 (0x04200001)
    gst-launch-1.0 v4l2src ! ...


Device found:

    name  : bcm2835-isp
    class : Video/Sink
    caps  : video/x-raw, format=(string)YUY2, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)UYVY, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)I420, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ 1:4:7:1, bt601, bt709 };
            video/x-raw, format=(string)YV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)BGRx, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], interlace-mode=(string)progressive, colorimetry=(string){ sRGB };
            video/x-raw, format=(string)BGR, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], interlace-mode=(string)progressive, colorimetry=(string){ sRGB };
            video/x-raw, format=(string)RGB, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], interlace-mode=(string)progressive, colorimetry=(string){ sRGB };
            video/x-raw, format=(string)NV21, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)NV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)RGB16, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], interlace-mode=(string)progressive, colorimetry=(string){ sRGB };
            video/x-bayer, format=(string)grbg, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], colorimetry=(string){ 2:1:1:0 };
            video/x-bayer, format=(string)gbrg, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], colorimetry=(string){ 2:1:1:0 };
            video/x-bayer, format=(string)rggb, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], colorimetry=(string){ 2:1:1:0 };
            video/x-bayer, format=(string)bggr, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], colorimetry=(string){ 2:1:1:0 };
            video/x-raw, format=(string)GRAY8, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ 2:4:1:0 };
            video/x-raw, format=(string)YVYU, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ bt601, bt709, 1:4:7:1 };
            video/x-raw, format=(string)GRAY16_LE, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], interlace-mode=(string)progressive, colorimetry=(string){ 2:4:1:0 };
    properties:
        udev-probed = true
        device.bus_path = platform-bcm2835-isp
        sysfs.path = /sys/devices/platform/soc/fe00b840.mailbox/bcm2835-isp/video4linux/video13
        device.subsystem = video4linux
        device.product.name = bcm2835-isp
        device.capabilities = :video_output:
        device.api = v4l2
        device.path = /dev/video13
        v4l2.device.driver = bcm2835-isp
        v4l2.device.card = bcm2835-isp
        v4l2.device.bus_info = platform:bcm2835-isp
        v4l2.device.version = 330257 (0x00050a11)
        v4l2.device.capabilities = 2216689666 (0x84200002)
        v4l2.device.device_caps = 69206018 (0x04200002)
    gst-launch-1.0 ... ! v4l2sink device=/dev/video13


Device found:

    name  : bcm2835-isp
    class : Video/Source
    caps  : video/x-raw, format=(string)YUY2, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)UYVY, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)I420, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)YV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)BGRx, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)BGR, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)RGB, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)NV21, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)NV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)RGB16, width=(int)[ 64, 16384 ], height=(int)[ 64, 16384 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)YVYU, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
    properties:
        udev-probed = true
        device.bus_path = platform-bcm2835-isp
        sysfs.path = /sys/devices/platform/soc/fe00b840.mailbox/bcm2835-isp/video4linux/video14
        device.subsystem = video4linux
        device.product.name = bcm2835-isp
        device.capabilities = :capture:
        device.api = v4l2
        device.path = /dev/video14
        v4l2.device.driver = bcm2835-isp
        v4l2.device.card = bcm2835-isp
        v4l2.device.bus_info = platform:bcm2835-isp
        v4l2.device.version = 330257 (0x00050a11)
        v4l2.device.capabilities = 2216689665 (0x84200001)
        v4l2.device.device_caps = 69206017 (0x04200001)
    gst-launch-1.0 v4l2src device=/dev/video14 ! ...


Device found:

    name  : bcm2835-isp
    class : Video/Source
    caps  : video/x-raw, format=(string)YUY2, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)UYVY, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)I420, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)YV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)NV21, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)NV12, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
            video/x-raw, format=(string)YVYU, width=(int)[ 64, 16384, 2 ], height=(int)[ 64, 16384, 2 ], framerate=(fraction)[ 0/1, 2147483647/1 ];
    properties:
        udev-probed = true
        device.bus_path = platform-bcm2835-isp
        sysfs.path = /sys/devices/platform/soc/fe00b840.mailbox/bcm2835-isp/video4linux/video15
        device.subsystem = video4linux
        device.product.name = bcm2835-isp
        device.capabilities = :capture:
        device.api = v4l2
        device.path = /dev/video15
        v4l2.device.driver = bcm2835-isp
        v4l2.device.card = bcm2835-isp
        v4l2.device.bus_info = platform:bcm2835-isp
        v4l2.device.version = 330257 (0x00050a11)
        v4l2.device.capabilities = 2216689665 (0x84200001)
        v4l2.device.device_caps = 69206017 (0x04200001)
    gst-launch-1.0 v4l2src device=/dev/video15 ! ...

参考

役に立ったリンク

OpenCVをbuildしてインストールする記事は多いが情報が最新かどうか怪しい

v4l2関連

Back to Index