#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型で返すんだろう...