概要
スマホをワイヤレスカメラとして使えるDroidCamアプリ。無料版でHD解像度接続すると、キャプション(文字)が表示されます。これをOpenCVを使って消す(画像処理でごまかす)ことにチャレンジしました
初回の取り組み:標準画質での接続
以前、DroidCamアプリをWindows上で動作するPythonアプリと接続する記事を書きました。
今回は、DroidCamのHD解像度で繋ぎます。接続自体は、上記の記事の中でも手法を記載しました。接続時のURL指定を以下のようにする、という手法です。
cap.open('http://192.168.179.3:4747/video/force/1280x720')
キャプション
HD解像度版での動作はトライアル扱いで、画面上に以下のようなキャプション(字幕)が出ます
DroidCam for iOS (HD Trial)
というキャプションが出ていますね。これを画像処理で消したいと思って処理しました。
結果
処理結果が以下です。
完全ではないですが、それなりに誤魔化せているようです
キャプションの特徴
- キャプションは毎回同じ大きさで画像の上に描画されている
- キャプションが配置される場所は接続ごとに変更される
- キャプションの配置は1回の接続中は変化しない
処理の説明
キャプションの特徴を踏まえて以下の処理を実施しました
- あらかじめキャプション部の画像を1枚、取得し2値化したものを保持しておく
- DroidCamと接続後、最初のフレームと2値化画像でOpenCVのテンプレートマッチを実施
- 今回の接続でのキャプション配置を記憶しておく
- 2フレーム目以降は以下の処理を繰り返す
- 受信フレームからキャプション部を切り出し
- 3x3カーネルでスキャンして中央画素が文字画素の場合に、文字以外の画素の平均で置換
- 上記の置換をrgbごとに実施。
- 切り出し画像に対してスキャンをして全ての画素置換が完了させる
- 切り出し画像内の文字画素の置換が完了したら受信フレームのキャプション部を上書きする
- 表示ウィンドウ画像を更新
処理中の画像など
あらかじめ準備しておくキャプション部の2値化画像
受信フレームから切り出したキャプション部の画像
3x3カーネル作業中の状態(2値化画像と受信画像)
2値化画像は反転して利用している。文字画素を黒とした方がBITWIDTH_ANDで処理しやすいため
受信画像
2値化カーネルと論理積ANDを取ることで、文字でない画素のみを残して
分子:輝度レベルの総和
分母:文字以外の画素数(2値化カーネルの白い画素数)
で置換画素のレベルを算出して置換する
置換後のキャプション部
結果と感想
・簡単な処理ですが、それなりの置換結果になっています
・1フレーム処理するのに0.5秒程度かかっています。
かなり遅いですね。早いパソコンが欲しいです。
アルゴを変えて処理が改善できるか?ということは気が向けば実施するかもしれません。
認識している課題
- 処理が遅い
- 置換結果を以降の処理で利用するので、置換結果がカーネルスキャン方向に依存する
- カーネルサイズが3x3なので、文字画素が連続していると置換精度が落ちる
環境
スマホ側
iPhone7
DroidCam:1.8.0
パソコン側
Mac Book Air(2013Mid)
Python:3.9.1
OpenCV:4.5.1