openCVとProcessingで肌色検出をし、その後当たり判定をしたい
openCVとProcessingで肌色検出のプログラムを書きました。
肌色を検出できたところは輪郭線が描かれるようになっています。
この後、画面の中心にrectで一辺100くらいの正方形を描き、輪郭線が正方形に当たった時に、正方形の色が変わる(当たる前は赤→当たると緑になる)プログラムを書きたいです。if文でcontoursが正方形に当たった時とそうでない場合で分けるなどして色々試しましたが、結局わかりませんでした…。
どのようにするのが最適な方法なのでしょうか…?
import controlP5.*;
import gab.opencv.*;
import processing.video.*;
Capture video;
OpenCV opencv;
//輪郭の配列
//Contourはデータ型、contoursはオブジェクト名
ArrayList<Contour> contours;
PImage dst;
int w = 640;
int h = 480;
ControlP5 slider, slider2;
int Hue_Min = 120;
int Hue_Max = 150;
void setup() {
size(640, 480);
rectMode(CENTER);
video = new Capture(this, w, h);
opencv = new OpenCV(this, w, h);
//controlP5でGUI作成
slider = new ControlP5(this);
//終わりにセミコロンをつける
slider.addSlider("Hue_Min")
.setRange(0, 180)
//初期値
.setValue(Hue_Min)
.setPosition(50, 40)
.setSize(200, 10);
slider2 = new ControlP5(this);
slider2.addSlider("Hue_Max")
.setRange(0, 180)
.setValue(Hue_Max)
.setPosition(50, 80)
.setSize(200, 10);
video.start();
}
void draw() {
//scale(2);
opencv.loadImage(video);
noFill();
strokeWeight(3);
//画像データをHSV色空間で扱う
opencv.useColor(HSB);
//カメラの画像を読み込み
opencv.loadImage(video);
//カメラの画像を表示
image(video, 0, 0);
//グレースケール
opencv.gray();
//範囲指定で2値価
opencv.inRange(Hue_Min, Hue_Max);
//閾値の設定
opencv.threshold(70);
dst = opencv.getOutput();
//輪郭を抽出
contours = opencv.findContours();
//検出された輪郭の数だけ、輪郭線を赤色で書く
//Contourはデータ型、contoursはオブジェクト名
for (Contour contour : contours) {
stroke(0, 255, 0);
contour.draw();
stroke(255, 0, 0);
strokeWeight(1);
beginShape();
for (PVector point : contour.getPolygonApproximation().getPoints()) {
vertex(point.x, point.y);
}
endShape();
}
}
//キャプチャー
void captureEvent(Capture c) {
c.read();
}
void keyPressed() {
if (keyCode == ENTER) {
saveFrame("screen-####.jpg");
}
}