Summary
Raspbery PiにOpenCVをインストールする。 中の人のサイトによるとpipでインストールするとC++から呼んだりできないのでbuildしてインストールすべきとのこと。
virtualenvを使っている場合のbuildのやり方も解説されているが、ちょうど良いものがなかったのでいくつかのサイトの情報をMixしてインストール用のスクリプトを作成した
中の人が書いたと思われるinstration guideを参考にした
$ 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メモリサイズを128MBに変更
設定の詳細はこちら
GPUメモリーサイズを変更すると、再起動後に画面の解像度やフォントサイズなどが変な値になっている場合があり、解像度を再設定する必要があった。画面は1280x720, 60Hz
設定の詳細はこちら
/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
スクリプトを実行すると~/opencv, ~/opencv_contribが作成され、さらに/usr/local/{lib, include}にライブラリファイルがインストールされる。
事前準備として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>
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したところ
chmodしてshellスクリプトを実行
問題なく完了
このやりかたで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() )
buildディレクトリの中でsudo make uninstallすればよい
$ cd ~/opencv/build
$ sudo make uninstall
念のために/usr/local/libなどにlibopencv*が残っていないことを確認
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 --> 失敗!
下記を参考にやってみる
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
作業手順は以下のとおり
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
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
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 の情報などが記載されているので確認する。
make
swap領域を2048に増やしているか確認 buildのなかでmake -j4を実行。(Pi3だと5時間、Pi4で1:40かかるらしい)
失敗したらbuildを全部消してやりなおし。そのときはmake -j1とする
$ make -j4
install
$ make install
$ sudo ldconfig
$ sudo apt-get update
確認
$ python
>>> import cv2
>>> cv2.__version__
'4.5.3'
>>> print( cv2.getBuildInformation() )
あとしまつ
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
カメラをOnにする
設定を変更してcamera deviceをONにする
再起動が必要
電源が切れたら電源ケーブルも抜いてカメラデバイスを接続する。
そして再起動
カメラが接続されているか確認
vcgencmdコマンドでdetected=1となっていればOK
$ vcgencmd get_camera
supported=1 detected=1
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を実行してキャプチャした画像
video_capture_test3.pyの動作中はこんな感じ(赤外線カメラなので色味が変)
使ったカメラはこんなやつ。上に写っているHDMI Video Captureデバイスは、Raspberry PiのHDMI出力をMacでキャプチャするのに使用している。上の2枚の写真もMacでvideo_capture_test2.pyを使ってキャプチャした画像。
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 ! ...