PythonのOpenCVでラベリングを行うにあたっては,
cv2.connectedComponentsWithStats(maskImg)
を使いますが,返ってくる値が何なのかよくわかりません.
以下の写真を使って,緑色の点をラベリングするとします.
返り値は4つあるので,とりあえず以下とします.
label1,label2,label3,label4 = cv2.connectedComponentsWithStats(maskImg) print(label1, label2, label3, label4, sep='\n')
とやってやると,実行結果は以下のようになりました.
#label1 3 #label2 [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] #label3 [[ 0 0 700 394 275573] [ 309 67 17 18 151] [ 327 249 9 11 76]] #label4 [[349.52311003 196.55010469] [316.50993377 76.0794702 ] [331.25 254.07894737]]
label1
単純にラベルの個数みたいです.ラベルのナンバリングは1がスタート(0が該当しない画素)なので要注意です.とりあえず,今回の場合だと3となっているので,3-1=2で,緑色の点が2つ検出できたということは間違いないでしょう.
label2
ラベルの値が格納されているらしいです.
つまり,上の画像の場合で言えば,1番目に見つかる緑色の点(上の点)があるところで,
[111111 111111 111111]
みたいになっており,2番め(下にある緑色の点)の場所が222…と格納されているようです.これを利用することによって,特定のラベルのみに処理を施すことができるということになります(未検証).
該当しない画素には0がラベリングされるということで,label1で0からスタートしない理由が解るということです.
label3
高さ,幅,面積が格納されています.
x y width height Size [ 0 0 700 394 275573] #ラベル0 [ 309 67 17 18 151] #ラベル1 [ 327 249 9 11 76] #ラベル2
左上の始点(x,y),幅と高さが取得できます.
画像のように赤いレクタングルをプロットしたい場合は,(x,y) , (x+width,y+height)みたいに簡単に指定できます.
label3は,以下のように書いたほうが解りやすく,扱いやすいかと思います.適当にループ回してやれば複数も問題なくできそうです.
x, y, width, height, size = label3[labelNumber]
label4
中心点(x,y)が格納されています.
[[349.52311003 196.55010469] #ラベル0 [316.50993377 76.0794702 ] #ラベル1 [331.25 254.07894737]]#ラベル2
ラベル0はあまり使うことはないと思いますので,最初から削除したほうが処理が書きやすくなると思います.
おわり.