59979


openCVとProcessingで肌色検出のプログラムを書きました。  
肌色を検出できたところは輪郭線が描かれるようになっています。

この後、画面の中心にrectで一辺100くらいの正方形を描き、輪郭線が正方形に当たった時に、正方形の色が変わる（当たる前は赤→当たると緑になる）プログラムを書きたいです。if文でcontoursが正方形に当たった時とそうでない場合で分けるなどして色々試しましたが、結局わかりませんでした…。

どのようにするのが最適な方法なのでしょうか…？

[code]

    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");
      }
    }
    
[/code]


CC BY-SA 4.0
2019-10-25T13:39:54.113
59976
2019-10-25T17:16:37.617
2019-10-25T14:29:51.803
36035
36035
question
opencv processing
openCVとProcessingで肌色検出をし、その後当たり判定をしたい


輪郭線は多角形として得られるので、多角形のいずれかの辺と正方形が当たっているかどうか検査すれば良さそうです。これは更に線分と線分が当たっているかどうか（交差しているかどうか）を検査すれば良いことになります。

線分と線分の交差は、以下の値がどちらも0以上1以下に収まっているかを調べれば分かります。詳しくは[このページ](http://www.jeffreythompson.org/collision-
detection/line-line.php)をご覧ください。

[code]

    float uA = ((x4-x3)*(y1-y3) - (y4-y3)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1));
    float uB = ((x2-x1)*(y1-y3) - (y2-y1)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1));
    
[/code]

当たっているかどうかが分かれば、あとはそれ次第で条件分岐して色を変え描画すれば良いです。


CC BY-SA 4.0
2019-10-25T17:16:37.617
59979
2019-10-25T17:16:37.617
19110
59976
answer