3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C#(OpenCV for Unity)でconnectedComponentsWithStatsを使う

Posted at

#connectedComponentsWithStatsとは
リファレンス(OpenCV公式)
リファレンス(OpenCV for Uniy)
二値画像に対してラベリングを行い,さらに各領域の面積や重心などの情報を取得できる関数です.

情報を取得できるものの,それらを参照する方法が結構ややこしいです.C++での参照の仕方はこの記事に書かれていますが,C#(OpenCV for Unity)で参照しようとして時間がかかったので書き残します.

#関数の仕様
関数の使い方は以下のとおりです.

var nLabels = connectedComponentsWithStats(src, labelImg, stats, centroids);

入力srcに対してラベリングした画像がlabelImgに,面積等の情報がstatsに,重心の位置がcentroidsに格納され,ラベル数を返します.
ややこしいのが,statsもcentroidsもMat型である点です.Listとかの方が扱いやすそうですが,なにかMatにする利点があるんでしょう.

#statsの参照方法
参考元

double area = stats.get(label, CC_STAT_AREA)[0];

labelはラベル番号です.Mat.get()はdouble型の配列を返しますが,この場合label番目の領域の面積だけが返ってくる(要素数1)ので添字0をつけます.CC_STAT_AREAを変えればstatsの各情報を参照することができ,labelをイテレータとしてfor文で回せば全領域の情報を参照できます.

#centroidsの参照方法
参考元

Point centroid = new Point(centroids.get(label, 0)[0], centroids.get(label, 1)[0]);

こちらもstats同様に,get()でラベル番号を指定します.第2引数に0を指定するとx座標が,1を指定するとy座標がそれぞれdouble型の要素数1の配列で返ってくるので,添字[0]を指定します.

#まとめ
Mat.get()は単に指定した座標の画素値を取得するメソッドだと思っていたので,今回のような使い方は理解するのに時間がかかりました.なんでMat型で返すんだろう...

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?