Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

OpenCVで使うためにDroidCam(WEBカメラの代わり)をインストールする!

投稿日:2021年4月25日 更新日:





外カメラで「cv2.VideoCapture」をしたい場合、WEBカメラが必要になります。DroidCamを使うとスマホをWEBカメラのように扱うことができますが、そのインストール方法の多くはZoomやSkypeで使うことを前提で、OpenCVを使う場合は想定されないことが多いです。そこで、できるだけ丁寧にOpenCVで使うためのDroidCamインストール方法を紹介したいと思います。(逆にZoomやSkypeで使いたいという方はブラウザバックしてください)

また、この記事は「DroidCamとOpenCVを使い年賀状の当選番号を半自動でチェックする」の補足的な記事でもあります。良ければこちらも見ていただけると嬉しいです。
(只今、執筆中です。公開は2021/5を予定しています)

作業環境とライブラリーのバージョンは以下の通りです。
スマホがAndroidであることを前提として話を進めますが、大まかな流れはiphoneも同じだと思います。
・windows 10
・python:3.6.13
・conda version : 4.10.1
・opencv:4.5.1
・ffmpeg:4.3.1
・スマートフォン(Android)

スポンサーリンク

共通事項(WiFi経由で接続、USB経由で接続)

DroidCamの接続は2種類あります。それぞれのメリット・デメリットと必要なものを列挙しました。判断基準は通信環境と撮影のしやすさで考えた方がよいです。

WiFi経由で接続

・安定した通信環境でないと、映像にラグが生じる
・ケーブルがいらないので撮影しやすい
・DroidCamアプリに表示される数字を入力すれば使えるのでスマホ側の作業が楽

USB経由で接続

・比較的、映像のラグが少ない
・USBケーブルでPCとつなぐため、手元しか撮影できない
・USBデバック機能をオンにする必要がありスマホ側の作業が少し面倒くさい
・DroidCamアプリに表示される数字を入力する必要がない

以下、DroidCamのインストール手順について説明しますが、接続自体はSkypeやZoomで利用する場合と同じなので軽く説明しています。分からない場合は他のサイト様を参考に進めた方がよいと思います。

スマホ側:DroidCamアプリをインストールする

スマホ側で行うことは基本的にこれだけです。
Google PlayストアからDroidCamを検索し、インストールします。DroidCamアプリを立ち上げるとカメラと音声の許可を求められるので、カメラしか使わない場合でも両方許可します。
(片方しか許可しないと「パーミッションエラー」でDroidCamアプリが利用できません)

許可が終わるとURLが2つある画面が表示されます。このURLの数字は後で使います。DroidCamアプリを立ち上げたまま、パソコン側の作業に進みます。

・パーミッションエラーが出た場合は?
誤って不許可にしてしまった場合は、スマホ本体の「設定」から「機器>アプリ」を選択します。スクロールでDroidCamを探し、タップしたら「許可」と書いてあるところをタップし、カメラまたは音声を許可します。

パソコン側:DroidCam Clientをインストールする

実は DroidCam Clientをインストールしなくても、スマホのDroidCamアプリに載っているURLをブラウザに入力すれば、スマホの外カメラの映像をみることができます。しかし、OpenCVで使いたい場合はやはりDroidCam Clientをインストールする必要があります。

以下のサイトから、OSに合わせた実行ファイルをダウンロードしてください。

実行ファイル(exe形式)を実行すると、インストール設定に移ります。インストール先の設定は特殊な事情がなければデフォルトのままで良いです。次にAndroidかiphoneかの選択がありますので、使用するスマホの機種に合わせてどちらか片方を選択してください。

PCとパソコン側:接続してOpenCVで使う

いよいよ最終工程です。接続設定は一度設定してしまえばその情報を記憶してくれるため、次回以降は少し楽になります。もう少し耐えてください<(_ _)>

WiFi経由で接続

を選択し、「Divice IP」の箇所にスマホDroidCamアプリに表示されている数字(WiFi IP)を入力してください。Audioのみの場合はvideoのチェックマークをはずしてください(逆もしかりです)すると、外カメの様子が、DroidCam ClientとスマホDroidCamアプリの方に表示されます。

USB経由で接続

スマホDroidCamアプリは予め立ち上げておきます。スマホをUSBケーブルでPCに接続してください。この際表示される「USB経由で接続の用途」は「この端末を充電する」でOKです。次に「開発者向けオプション」を解放します。スマホ本体の「設定」から一番したまでスクロール すると「端末情報(またはデバイス情報)」があります。一番下にスクロールすると「ビルド番号」があり、これを7回タップすることで解放されます。

解放した後、スマホ本体の「設定」に戻り、「端末情報(またはデバイス情報)」のすぐ上にある「開発者向けオプション」をタップします。その中にあるデバック>USBデバックをオンにしてください。すると、「USBデバックを許可しますか?」というメッセージが2回表示されるのでOKをタップします。PCのDroidCam Clientに戻り、をクリックすると自分のスマホの機種名称が自動的に表示されるのでそのままスタートをおすと、外カメの様子が、DroidCam ClientとスマホDroidCamアプリの方に表示されます。

確認用Pythonコード

OpenCVはconda-forgeリポジトリのものを使用してください。
以下の1行をコピペすれば大丈夫です。

$ conda install -c conda-forge opencv ffmpeg

最後に確認用のPythonコードを載せます。実行してTureが出力されれば成功です。device_numはカメラの種類を表します。device_numが0の場合はPCの内臓カメラ、1以降がWEBカメラと振り分けられているようです。私の場合は0が内臓カメラ、1がWEBカメラになっていました。PCのDroidCam Client、スマホのDroidCamアプリを起動させた状態で実行してください。

import cv2

device_num = 1
cap = cv2.VideoCapture(device_num)
print(cap.isOpened())

成功するとTrueの後に以下のようなwarningが表示されますが、これは無視して大丈夫です。

$ python test_droidcv.py
True
[ WARN:0] global ..\modules\videoio\src\cap_msmf.cpp (434) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback

・画質が悪い場合は?
DroidCam Clientと一緒にインストールされているHD modeから変更可能です。デフォルトでは480p(4:3)になっています。

・使用後USBケーブルを抜くことができない
使用後、USBマーク(「ハードウェアを安全に取り外してメディアを取り外す」)を右クリックし「(スマホの機種名)を取り出す」を選択すると、

USB Composite Deviceの取り外し中にエラーが発生しました
プログラムが'ADB Interface'デバイスをまだ使用しているため、デバイスを停止できません。デバイスを使用していると思われるプログラムを閉じてから再試行してください。

というウインドウが表示される場合があります。この場合はOKをおしてウインドウを閉じ、スマホのUSBデバックをoffにしてください。

どうしてもprint(cap.isOpened())でFalseが表示される場合

私が実際に直面したトラブルとその解決方法について述べます。参考になれば幸いです。

PCのカメラアクセスをONにする

Pythonスクリプトを実行した際に以下のようなエラーが発生していませんか?

$ python test_droidcv.py
[ WARN:0] global ..\modules\videoio\src\cap_msmf.cpp (434) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
False

この場合、PCのカメラアクセスがONになっているか確認してください。
windowsであれば、から設定を選び、プライバシーにカメラとマイクの項目があるので、そこからアクセスをONにしてください。

WiFi経由で接続であってもcv2.VideoCaptureの引数にURLをいれない

サイトによっては、以下のようにcv2.VideoCaptureの引数に「IP Cam Access」をいれてくださいと書いています。しかし、少なくとも私の環境ではエラーが出ました。

import cv2
#http://(WiFi IP):4747/videoやhttp://(WiFi IP):4747/mjpegfeedと入れるべきというサイトもあります
cap = cv2.VideoCapture('http://(WiFi IP):4747')
print(cap.isOpened())

エラー内容はこんな感じです。

$ python test_droidcv.py
[ERROR:0] global ..\modules\videoio\src\cap.cpp (142) cv::VideoCapture::open VIDEOIO(CV_IMAGES): raised OpenCV exception:
OpenCV(4.5.1) ..\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): http://(WiFi IP):4747 in function 'cv::icvExtractPattern'

解決方法は上のように、cv2.VideoCaptureの引数に数字を入れるとprint(cap.isOpened())がTrueになりました。DroidCam Clientでスタートを押した時点で外部カメラ登録がされているのでしょうか・・・?ともかく、接続方法が異なっても実行するPythonコードが共通なのはうれしいですね。


-Python
-,

Copyright© latotex-blog , 2021 All Rights Reserved Powered by STINGER.