質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

1回答

2307閲覧

openCVとProcessingの肌色検出で当たり判定の実装をしたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/10/25 14:31

前提・実現したいこと

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

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

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

該当のソースコード

Processing

1import controlP5.*; 2import gab.opencv.*; 3import processing.video.*; 4 5Capture video; 6OpenCV opencv; 7//輪郭の配列 8//Contourはデータ型、contoursはオブジェクト名 9ArrayList<Contour> contours; 10 11PImage dst; 12int w = 640; 13int h = 480; 14ControlP5 slider, slider2; 15int Hue_Min = 120; 16int Hue_Max = 150; 17 18 19void setup() { 20 21 size(640, 480); 22 rectMode(CENTER); 23 video = new Capture(this, w, h); 24 opencv = new OpenCV(this, w, h); 25 26 //controlP5でGUI作成 27 slider = new ControlP5(this); 28 //終わりにセミコロンをつける 29 slider.addSlider("Hue_Min") 30 .setRange(0, 180) 31 //初期値 32 .setValue(Hue_Min) 33 .setPosition(50, 40) 34 .setSize(200, 10); 35 36 slider2 = new ControlP5(this); 37 slider2.addSlider("Hue_Max") 38 .setRange(0, 180) 39 .setValue(Hue_Max) 40 .setPosition(50, 80) 41 .setSize(200, 10); 42 43 video.start(); 44} 45 46void draw() { 47 //scale(2); 48 opencv.loadImage(video); 49 50 51 noFill(); 52 strokeWeight(3); 53 54 //画像データをHSV色空間で扱う 55 opencv.useColor(HSB); 56 57 //カメラの画像を読み込み 58 opencv.loadImage(video); 59 //カメラの画像を表示 60 image(video, 0, 0); 61 //グレースケール 62 opencv.gray(); 63 64 //範囲指定で2値価 65 opencv.inRange(Hue_Min, Hue_Max); 66 //閾値の設定 67 opencv.threshold(70); 68 dst = opencv.getOutput(); 69 //輪郭を抽出 70 contours = opencv.findContours(); 71 72 //検出された輪郭の数だけ、輪郭線を赤色で書く 73 //Contourはデータ型、contoursはオブジェクト名 74 for (Contour contour : contours) { 75 stroke(0, 255, 0); 76 contour.draw(); 77 78 stroke(255, 0, 0); 79 strokeWeight(1); 80 beginShape(); 81 for (PVector point : contour.getPolygonApproximation().getPoints()) { 82 vertex(point.x, point.y); 83 } 84 endShape(); 85 } 86} 87 88//キャプチャー 89void captureEvent(Capture c) { 90 c.read(); 91} 92 93void keyPressed() { 94 if (keyCode == ENTER) { 95 saveFrame("screen-####.jpg"); 96 } 97}

補足情報(FW/ツールのバージョンなど)

Processing3
OpenCV for Processing 0.5.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そのプログラムで肌色を検出しているようには見えませんが、それはともかく。

きれいな直線が検出されちゃうと難しいですけれど、自然の画像ならノイズも載っているでしょうから、
for (PVector point : contour.getPolygonApproximation().getPoints()) {
のループの中で頂点と推測された場所が正方形の中に入っているかどうかを判別することでなんとかならないか、と思います。

投稿2019/10/26 08:25

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問