Jeffrey Cross
Jeffrey Cross

コードボックス:OpenCVで頭を失う

OpenCVは「リアルタイムのコンピュータビジョンのためのプログラミング関数のライブラリ」です。このライブラリには、画像操作、オブジェクト検出、特徴抽出、その他さまざまなツールのための500以上のアルゴリズムが含まれています。見ることができるプログラムを書く。

OPENCV Processing and Java LibraryはStéphane CousotとDouglas Edric Stanleyによって運営されているプロジェクトで、OpenCVのサブセットを使用することを可能にします。処理中。ハロウィーンを記念して、このCodeboxはOpenCVを使ってビデオフィードからリアルタイムで人々の頭を取り除く方法を紹介します。例えば:

今後の記事では、この素晴らしいライブラリのためのあまり面倒なアプリケーションについて説明します。

OpenCV処理とJavaライブラリのインストール

ライブラリを使用する際の最初のステップは、http://ubaa.net/shared/processing/opencv/からダウンロードしてインストールすることです。サイトのドキュメントは素晴らしいです。メインページの「インストール手順」に記載されている手順に従ってください。手順を実行したら、Processingを起動してから、detect()例のコードを試してみます。この例では、Webカメラで検出された顔(正面図)の周りに赤い四角形を配置します。このようなものが見えるはずです。

Windowsユーザーへの注意:ProcessingでWebカメラを使用するには、QuickTimeとWinVDIGをインストールする必要があります。

スケッチを設定する

基本を手に入れたら detect() 作業例では、次のスケッチを使用できます。このシリーズの他の記事と同様に、下のボックスにあるすべてのテキストを強調表示してctrl + cを押すか、直接Makezineコードリポジトリに移動してheadless_cam.pdeをコピーしてください。

プログラムを起動すると、「シーンから出ていずれかのキーを押す」というメッセージが表示されます。海岸がきれいになったら、任意のキーを押して画像に戻ります。あなた(そして他の誰もが)、OpenCVのおかげで、ヘッドレスになるべきです。あなたが動き回っているとき、あなたはあなたの頭が出入りするであろうことに気づくでしょう - これは何かがOpenCVの検出アルゴリズムを妨害するときに起こります。たとえば、顔の前に手を置くと、OpenCV検出アルゴリズムが「中断」します。

討論

では、これはどのように機能するのでしょうか。それは実に簡単です - スケッチはOpenCVのを使って顔を検索することだけです detect() 次に、検出された顔をスケッチの開始時に保存された背景画像と同じ(ただし少し大きい)ピクセルで置き換えます。これにより、顔が「消え」ます。照明のわずかな違いによって、新しい画像と古い画像の間に小さな変化が生じ、置き換えられた顔が少しぼやけたように見えます。理論的には、他のOpenCV機能を使用してこれらのいくつかを滑らかにできるはずですが、それは将来のプロジェクトのためのものです。

スケッチの最初のステップは、空の背景シーンの写真を保存することです。これは copy() コマンド keyPressed() 方法:

bg.copy(cam、0,0、width、height、0,0、width、height);

このコマンドには2つの画像が必要です。 image、これはピクセルがコピーされる場所です 、そして、 ソース image、これはピクセルがコピーされる場所です から。それを使うためには、 copy() デスティネーションイメージのメソッド(この場合は変数) bg)と9つの必須引数(!)を指定します。

  • ソース コピー元の画像この場合、変数を使用しています カムWebカメラからの現在のフレームが含まれています。
  • コピーされるソースイメージ内の領域。この領域は、次の4つの引数、つまり、領域の左上隅のx座標とy座標、および領域の幅と高さによって記述されます。
  • コピーされたピクセルが移動する先の画像の領域。これらは前の4つの引数と似ており、領域の幅と高さと共にx座標とy座標で構成されています。寸法がソースエリアとデスティネーションエリアで異なる場合、Processingは自動的に画像を拡大縮小します。

このコマンドが完了すると、背景シーンのコピーが変数に保存されます。 bg。次のステップは、OpenCVを使って面を検索することです。前述のように、これは detect() 四角形の配列を返すmethod Rectangleは、処理の派生元となる基本言語であるJavaに含まれるクラスです。 (Processingに関する素晴らしいことの1つは、Javaで使用できるすべてのコマンドを使用できることです。実際、非常に強力な言語になっています。)Rectangleには、4つの重要なフィールドがあります。左隅、幅と高さ。 (おなじみ?)

私たちがやりたかったのが顔だけを置き換えることであれば、単純に copy() 同等の領域をコピーするコマンド。 (注: loadPixels() そして updatePixels() このメソッドは、画像内のピクセルにアクセスしたり更新したりするときに必ず必要になります。)次に、そのコードを示します。

fg.copy(cam、0,0、width、height、0,0、width、height); //カメラ画像をfg opencv.copy(cam)にコピーします。 //画像をopenCVのバッファにコピーするRectangle [] faces = opencv.detect(); //(int i = 0; iのFRONTALFACeに似たものをすべて検出します

これが出力です。

お分かりのように、顔だけを削除するのは正しいことではありません。頭の多くが見えているからです。そのため、箱のサイズを大きくする方法も必要です。これが仕事です enlargeFaceBox()これは、少し三角法を使用してボックスを所定の割合で拡大し、対角線に沿って平行移動します。次の図は、何が起こっているのかを示しています。

四角形を対角線上にスライドさせる正しい変位を計算すると、トリガーが有効になります。主な機能は atan2()これは、x軸に対する2点間の角度を計算します。 (この角度はしばしば呼ばれます シータ 荒れ果てた古い数学者による)あなたが持っていたら シータ、あなたが使用することができます cos() そして 罪() xとyの変位を計算する関数 dx そして 乾く。コードは次のとおりです。

四角形enlargeFaceBox(float incPct、int x、int y、int w、int h){float r = dist(0,0、w、h)/ 2; //中心対角フロートの半径を計算します。theta = atan2(h、w); //対角フロートの角度を計算するdx = r * incPct * cos(theta); // float dy = r * incPct * sin(theta);新しいRectangle((int)(x - dx)、(int)(y - dy)、(int)(w + 2 * dx)、(int)(h + 2 * dy))を返します。 }

最後に、ボックスを拡大しているので、Swat an targetsリストのプロジェクトで行ったように、ボックスが画面の表示領域内にあることを確認する必要があります。

faceBox = enlargeFaceBox(0.75、faces [i] .x、faces [i] .y、faces [i] .width、faces [i] .height); if(faceBox.x <0){faceBox.x = 0; if(faceBox.x + faceBox.width> width){faceBox.width = width - faceBox.x;} if(faceBox.y <0){faceBox.y = 0; if(faceBox.y + faceBox.height> height){faceBox.height = height - faceBox.y;} ...

以上です。あなたがハロウィーンでこれのために不気味な使用法を見つけることができると思います。

シモンズ:あなたは、Processing.orgのサイトでダニエル・シフマンの優れた画像とピクセルチュートリアルから画像を扱う方法の完全な詳細を学ぶことができます。 (この章は、彼の素晴らしい著書 『Learning Processing:プログラミングの初心者向けガイド』の抜粋です。本当にProcessingを習得したいのであれば、これらの記事をピックアップすることを強くお勧めします。)

メーカーの小屋で:


Processing入門Processing、コードを使用して図面、アニメーション、インタラクティブグラフィックを作成するための簡単な言語であるProcessingを使用して、コンピュータプログラミングを簡単に学ぶことができます。プログラミングコースは通常理論から始まりますが、この本では創造的で楽しいプロジェクトに飛び込むことができます。基本的なプログラミングを学びたい人には理想的で、プログラミングのスキルがある人のためのグラフィックスの簡単な紹介としても役立ちます。

シェア

コメントを残します