2017-11-11 19 views
1

cv2.findContourscv2.minAreaRectで見つかったオブジェクトと回転した長方形のバイナリイメージがあります。イメージは[0; 1]に正規化されます 境界矩形内の非ゼロ領域を数える最も効率的な方法は何ですか?領域回転矩形の非ゼロピクセルをカウントする

Example image

+0

パフォーマンスがさらに必要な場合は、描画の代わりにピクセルを数えるdrawContoursコードを使用します。 – Micka

答えて

2
  • 元の画像と同じ大きさを持つ新しいゼロ値のマットを作成します。
  • 回転した矩形を(RotatedRectの頂点を使用してfillConvexPolyに)描画します。
  • Bitwise_andあなたのオリジナルマスク
  • と、この画像はあなたの回転長方形のバウンディングボックスを持っているので、あなたはまた、画像のROIの前の手順を適用することができる結果画像

にfindnonzero関数を適用します。

2

Humam Helfawiの答えによると、私は少しのステップを提案チューニングされてきたので、次のコードは、私が必要なものをやっているようだ:

rectangles = [(cv2.minAreaRect(cnt)) for cnt in contours] 
for rect in rectangles: 
    rect = cv2.boxPoints(rect) 
    rect = np.int0(rect) 
    coords = cv2.boundingRect(rect) 
    rect[:,0] = rect[:,0] - coords[0] 
    rect[:,1] = rect[:,1] - coords[1] 
    area = cv2.contourArea(rect) 
    zeros = np.zeros((coords[3], coords[2]), np.uint8) 
    cv2.fillConvexPoly(zeros, rect, 255) 
    im = greyscale[coords[1]:coords[1]+coords[3], 
    coords[0]:coords[0]+coords[2]] 
    print(np.sum(cv2.bitwise_and(zeros,im))/255) 
1

contoursは点のリストです。この形状を同じサイズの空のバイナリイメージにcv2.fillConvexPolyで塗りつぶしてから、cv2.countNonZeroまたはnumpy.count_nonzeroを使用して占有ピクセル数を取得できます。

関連する問題