2017-11-11 210 views
1

我得到一個帶有對象和旋轉矩形的二進制圖像,在cv2.findContourscv2.minAreaRect中找到。圖像被標準化爲[0; 1] 在邊界矩形內計算非零區域的最有效方法是什麼?在區域旋轉矩形中計算非零像素

Example image

+0

如果您需要更高的性能,請調整drawContours代碼來計算像素而不是繪圖。 – Micka

回答

2
  • 創建新的零值有原始圖像的大小相同墊。
  • 在(fillConvexPoly中使用RotatedRect頂點)在其上繪製旋轉的矩形。
  • Bitwise_and與你原來的面具
  • 這個圖像應用findnonzero功能結果圖像

。您也可申請在圖像的ROI前面的步驟,因爲你有你的旋轉矩形的邊框。

2

據,私自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.countNonZeronumpy.count_nonzero來獲取佔用像素的數量。