[Go to “teaching” in Morimoto Lab]
Here we study to use libraries of video and OpenCV.
この講義ではウェブカメラが必要です。
Let’s see the example “GettingStartedCapture”.
Import Video library and select the below sample code.
File > Sample > Library > Video > Capture > GettingStartedCapture
[※mac OS Catalina以降の環境で、Videoライブラリのインポートエラーが起こる場合はこちらを参照。]
Let’s execute the above sample program.
The below is a result of printArray() by my pc.
They are from String[] camera = Capture.list();
Available cameras:
[0] “name=Rear Camera,size=640x480,fps=30”
[1] “name=Rear Camera,size=640x360,fps=30”
[2] “name=Rear Camera,size=3264x2448,fps=15”
[3] “name=Rear Camera,size=2592x1944,fps=15”
[4] “name=Rear Camera,size=1920x1080,fps=24”
[5] “name=Rear Camera,size=1600x1200,fps=30”
[6] “name=Rear Camera,size=1280x720,fps=60”
[7] “name=Front Camera,size=640x480,fps=30”
[8] “name=Front Camera,size=160x120,fps=30”
[9] “name=Front Camera,size=176x144,fps=30”
...
キャプチャーリストの番号は使うカメラを切り替えるために使います。
サンプルコードの下記の部分では、cameras[0]なので0番目のカメラを使っています。
cam = new Capture(this, cameras[0]);
saveFrame()は実行画面を連番静止画にして保存することができます。
saveFrame("frames2/line-######.png");
↑シャープ記号の数の桁の連番になります。
/で区切れば、それ以前の部分の名前のフォルダを自動で作成してくれます。
画像(フォルダを作成する場合はフォルダ)はプログラムのファイルと同じフォルダ内に作成されます。
画像ができたら、Processingのメニューのツールより、「ムービーメーカー」を選び、連番静止画のあるフォルダを選択して、「動画を作成」ボタンを押すと動画が作成されます。
If your pc doesn’t have any camera, please tell me.
OpenCV is a library of programming functions mainly aimed at real-time computer vision.
OpenCV is used for C, C++, C#, Java, … very popular!
OpenCV for Processingで何ができるのでしょう?
以下の場所にあるサンプル名を見ると大体わかります。
Contributed Libraries > OpenCV for Processing.
サンプルの内、FaceDetectionをダブルクリックして実行しましょう
男性の顔の部分が四角で囲まれた画面が表示されると思います。
下記はそのサンプルコードに追記をしたものですが、
顔写真データがないと同じ挙動にならないので、
「サンプル」から実行し、
「名前を付けて保存」をして複製を作成して編集するとよいでしょう。
import gab.opencv.*; //openCVのライブラリ
import java.awt.Rectangle; //javaのRectangleクラス
OpenCV opencv; //OpenCVクラスの変数を定義
Rectangle[] faces;//1. Rectangleクラスの配列を定義(顔を複数検出できるため)
void setup() {
//静止画の読込
opencv = new OpenCV(this, "test.jpg");
size(1080, 720);
//2.
//顔のデータをロード→顔を検出
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
//目のデータをロード→目を検出
//opencv.loadCascade(OpenCV.CASCADE_EYE);
//口のデータをロード→口を検出
//opencv.loadCascade(OpenCV.CASCADE_MOUTH);
//顔を検出
faces = opencv.detect();
}
void draw() {
//入力画像の描画
image(opencv.getInput(), 0, 0);
noFill();
stroke(0, 255, 0);
strokeWeight(3);
//顔は複数検出可能なので、for文を使っているがここでは一つの顔のみ
for (int i = 0; i < faces.length; i++) {
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
}
Rectangleクラスには、x, y, width, height (左上のx,y座標、横・縦幅)がある。詳細はこちら。
setup内のloadCascadeのところに目や口を検出するコードを記載しています。
このように、顔以外にも検出が可能ですので色々試してみましょう。
更に他の部分を検出したい場合は、 こちらを参考にしてください。
自分のPCのカメラで撮った動画に対してリアルタイムに顔検出をするプログラムを書いてください(下にある動画のように)。
更に、何かしらの画像を読込み、キャプチャした動画の顔や目などの上に表示するようにしてください。
Optical flowは2つの画像間で各点がどう動いたのかを表します。
動画なら、一つ前のフレームのある位置が次のフレームでどこに行ったのかをベクトルで表します。
以下はOpenCV for ProcessingのOptical Flowの実行結果です。