memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ProcessingのfindContoursの引数のメモ

Processingでちょっとした画像処理をしようとすると、ほぼ必ずお世話になるのが以下のOpenCVのラッパークラスライブラリです。

GitHub - atduskgreg/opencv-processing: OpenCV for Processing. A creative coding computer vision library based on the official OpenCV Java API

今年の成果物?の一つであるデスクライトでも、カメラの画像から物体を検出するのにこのライブラリを使わせていただきました。

このライブラリはサンプルも豊富でサンプル通りに使う分には問題ないのですが、ちょっと応用しようとするとドキュメントがないためソースを読む必要があります。

今週末のイベント用(つくるとVol.4)に少し機能を増強しているところで、また調べ物をしたのでメモしておこうというのがこのエントリーの趣旨です。

ちなみに何をしようとしているかと言いますと、(現在はちょっと違うのですが動画を撮影していないので古いバージョンです)以下のような2Dの対戦ゲームを作ったのですが。

www.youtube.com

これにステージを作りたいな、ということです。それもスプラのような既存のステージではなく、その場で来場者に描いて作ってもらえるようなものです。記入シートは以下のような感じ。最初、レゴブロックで作ってカメラで撮影して。。。とも思ったのですが、いまいち自由度高くないし面白みにかけるな。。。ということでペンで描くようにしました。

f:id:ke_takahashi:20171107150014j:plain

外枠の線を基準として、中に書かれた領域を識別して障害物とします。そこは通れない、弾ももちろん止まる、そんな感じです。あと2、3日でできるかな。。。できたらいいな。。。という感じです。

話を戻して。

ブロブ(領域)検出するときにタイトルのメソッドを利用するのですが、これには引数が2つつけられます。引数なしのメソッドも用意されているので、通常は何も考えずに引数なしを利用すると思います。サンプルもそう書いていますので。引数なしの場合は以下のようなメソッドが呼ばれます。第1引数はtrue、第2引数はfalseですね。

	public ArrayList<Contour> findContours(){
		return findContours(true, false);
	}

で、引数の定義は以下のように書かれています。

	public ArrayList<Contour> findContours(boolean findHoles, boolean sort){

ブロブ検出したときに、そのブロブに内包されるブロブも検出したい場合はfindHolesをtrueにします。findContoursは結果であるブロブ集合をArrayListで返してくれます。このときに、面積の大きさでソート(降順のようです)したい場合は第2引数であるsortをtrueにすることになります。

ちょっとした実行例です。

findContours(true, false)の場合
f:id:ke_takahashi:20171107145034p:plain

findContours(false, false)の場合
f:id:ke_takahashi:20171107145024p:plain