0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fedora32(VMware)でwebカメラ(UVC)を動かす

Last updated at Posted at 2020-09-12

目的

OpenCV4.2でwebカメラを動かしたい!!

環境

OS : Fedora32 64bit (VMware Workstation 15 Player)
webカメラ : ELECOM UCAM-C0220FBNWH

この記事のまとめ

躓いた点

webカメラは認識されているが画面に映らない

解決法

VMwareの 仮想マシン設定 >> USBコントローラー >> USBの互換性USB2.0からUSB3.1へ変更する


方法

OpenCVのインストール

まずはOpenCV4.2のインストールをします。

sudo dnf update
sudo dnf install opencv

これでサポートされている中の最新のOpenCVがインストールされると思います。

プログラミング

次にプログラムを書きます。今回は公開されているプログラムをOpenCV4.2用に変更して利用させていただきます。
sampleというディレクトリを作成してその中にsample.cppを書きます。好きでVimを使っているのでエディタは何でも良いです。

mkdir sample
cd sample
vim sample.cpp
sample.cpp

# include <opencv2/core/core.hpp>
# include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  cv::VideoCapture cap(0);
  // 様々な設定...
  cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
  cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
  // カメラがオープンできたかの確認
  if(!cap.isOpened()) return -1;

  cv::namedWindow("Capture", cv::WINDOW_AUTOSIZE|cv::WINDOW_FREERATIO);
  while(1) {
    cv::Mat frame;
    cap >> frame;  // キャプチャ
    // 様々な処理
    // ...
    cv::imshow("Capture", frame); // 表示
    if(cv::waitKey(30) >= 0) 
       {
	  cv::imwrite("cap.png", frame);
       break;
       }
  }
}

参考にさせていただいたプログラム

ビルド

ビルド方法は様々ありますが今回は汎用性も加味してcmakeを用います。
sampleディレクトリ内にCMakeLists.txtを作ります。

vim CMakeLists.txt

中身は公式に公開されているものを参考にさせていただきます。

CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project( Sample )
find_package( OpenCV REQUIRED )
file(GLOB SRC
    "*.h"
    "*.cpp"
)
add_executable( exe ${SRC} )
target_link_libraries( exe ${OpenCV_LIBS} )

参考にさせていただいたプログラム

カメラを接続

PCにカメラを接続しポップアップで出てくる新しいUSBデバイスが検出されましたと言う画面から仮想マシンに接続を選択します。

以下のコマンドでカメラが認識されているか確認できます。

$ lsusb
Bus 001 Device 002: ID 056e:7016 Elecom Co., Ltd UCAM-C0220F

このようにカメラっぽいものがあれば認識されています。

※今回用いているカメラはUVCと言われるカメラの種類で自分でドライバを入れる必要がないため、ドライバのインストールについては触れません。UVCでないカメラで認識されない場合は各自ドライバをインストールしてください。

実行(まだここでは動かないため注意)

sampleディレクトリ内で以下のコマンドを実行します。

mkdir build
cd build
cmake ..
make
./exe

すると

$ ./exe
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/videoio_registry.cpp (187) VideoBackendRegistry VIDEOIO: Enabled backends(7, sorted by priority): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); V4L2(970); CV_IMAGES(960); CV_MJPEG(950); FIREWIRE(940)
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (690) open OpenCV | GStreamer: v4l2src device=/dev/video0 ! videoconvert ! appsink drop=true
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (723) open OpenCV | GStreamer: mode - MANUAL

と出てきて写真も撮れず、プログラムも終了しません。

とりあえずCtrl+Cで終了します。

原因

  • プログラムが悪い
  • カメラが悪い
  • ドライバが機能していない
  • OSが悪い
  • VMwareが悪い

と様々な原因が考えられたため、それぞれ検証しました。

すると、カメラは正常で、ドライバも機能しているし、Ubuntuでも同じ症状が出ていました。試しにcheeseという写真を撮るだけのソフトを使ってみると、PCのカメラでは映るがwebカメラでは黒い画面になりソフトが動きません。つまりプログラムが悪いわけでも無さそうでした。
この症状からすると接続はされているが間にVMwareがあるためデータが遮断されている、という可能性がありました。その前提で調べてみるとこのサイトが見つかりました。
このサイトには

Change USB Compatibility to 1.1 in Virtual Machine Settings.

と書かれておりVMwareの設定からUSB接続の設定をUSB1.1に変えると良くなるということでした。恐らく古いサイトのためUSB1.1への変更をしていますが、それぞれのパソコンかwebカメラにあった設定にするべきなのだと思います。

解決法

VMwareの左上から、Player(P) >> 管理(M) >> 仮想マシン設定(S)を選択します。
image.png
開いた画面のデバイスからUSBコントローラを選び、USBの互換性をUSB 3.1に変更しOKを押します。
image.png

すると、サスペンドモードになりVMwareが閉じます。そのためもう一度VMwareからFedoraを起動させてください。

元の画面に戻ったはずなのでもう一度プログラムを実行します。

$ ./exe
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/videoio_registry.cpp (187) VideoBackendRegistry VIDEOIO: Enabled backends(7, sorted by priority): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); V4L2(970); CV_IMAGES(960); CV_MJPEG(950); FIREWIRE(940)
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (690) open OpenCV | GStreamer: v4l2src device=/dev/video0 ! videoconvert ! appsink drop=true
[ INFO:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (723) open OpenCV | GStreamer: mode - MANUAL
[ WARN:0] global /builddir/build/BUILD/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

と出て
刑務所に入れられる消しゴム.png
見事カメラが動きます!!
また、buildディレクトリ内にcap.pngが出来ているはずです。

終了時はCtrl+Cで強制終了することができます。

まとめ

VMwareで外部との接続が必要なものを動かすときはVMwareの設定に気をつけましょう。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?