[Processing]OpenCVを利用した人物認識(その1)


開発環境


言語

- Processing 3.1.1

eclipseを使用し、core.jarをインポートした環境でコーディングしているため、ProcessingのIDEでは実行できません。

参考URL

http://hiroyukitsuda.com/archives/1721

- java 1.8.0_91

API

- Video

動画ファイル、ライブカメラ等の映像を扱う機能を提供

https://processing.org/reference/libraries/video/index.html

- OpenCV for Processing

画像処理・画像解析および機械学習等の機能を提供

https://github.com/atduskgreg/opencv-processing

 

OS

- macOS sierra 10.12.6


フロー

1.setup

1.1 動画ファイルを指定

1.2 検知対象を設定

1.3 再生設定

2.draw

2.1 OpenCVが検知した対象を配列に格納

2.2 検知対象を四角形で表示


コード

package detection.phase1;

import java.awt.Rectangle;

import gab.opencv.OpenCV;
import processing.core.PApplet;
import processing.video.Movie;

public class WalkerDetection extends PApplet {
        Movie movie;
        OpenCV openCV;
        
        Rectangle[] detectsFromOCV;
        
        public void settings() {
                size(1280, 720);
        }
        
        public void setup() {
                //動画ファイルを指定
                movie = new Movie(this, "umeda_rain.m4v");
                openCV = new OpenCV(this, width,height);

                //検知対象に歩行者を指定
                openCV.loadCascade(OpenCV.CASCADE_PEDESTRIAN);
                
                //ループ再生
                movie.loop();
                movie.play();
                //再生スピード
                movie.speed(1);
        }
        
        public void draw() {
                //動画をメモリに展開
                image(movie, 0, 0);
                openCV.loadImage(movie);
                
                //OpenCVで検知したオブジェクトを配列に格納
                detectsFromOCV = openCV.detect();
                
                //検知対象を四角形で表示
                noFill();
                stroke(255, 0, 0);
                strokeWeight(3);
                for (int i = 0; i < detectsFromOCV.length; i++) {
                        rect(detectsFromOCV[i].x, detectsFromOCV[i].y,
                                        detectsFromOCV[i].width, detectsFromOCV[i].height);
                }
        }
        
        //映像フレーム毎に自動呼び出しされるイベント
        public void movieEvent(Movie m) {
                //現在のフレームを読み込み
                m.read();
        }
        
        //キー押下
        public void keyPressed() {
                //Spaceキー
                if(key == ' '){
                        //一時停止
                        movie.pause();
                }
                //ENTERキー
                if(key == ENTER){
                        //再生
                        movie.play();
                }
        }

        public static void main(String[] args) {
                PApplet.main(WalkerDetection.class.getName());
        }

}

実行結果