OpenCV - minAreaRect // points 不是数值元组

OpenCV - minAreaRect // points is not a numerical tuple

错误点不是正在输出的数字元组。

# Converting image to a binary image
# ( black and white only image).
blur = cv2.GaussianBlur(img,(5,5),0)
_, threshold = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

print(contours)

minArea = cv2.minAreaRect(contours)

等高线是:

(array([[[747, 305]],

       [[746, 306]],

       [[745, 306]],

       [[744, 307]],

       [[743, 308]],

       [[743, 309]],

       [[744, 310]],

       [[744, 311]],

       [[744, 312]],

       [[744, 313]],

       [[757, 306]],

       [[756, 306]],

       [[755, 306]],

       [[754, 306]],

       [[753, 306]],

       [[752, 305]],

       [[751, 305]],

       [[750, 305]],

       [[749, 305]],

       [[748, 305]]], dtype=int32),)

Overload resolution failed:

  • points is not a numerical tuple
  • Expected Ptr<cv::UMat> for argument 'points'

有什么明显的我做错了吗?

cv2.findContours returns 等高线列表。每个轮廓都是一个点列表。因此contours返回的不是点列表,而是点列表的列表。

另一方面,

cv2.minAreaRect 需要输入单个点列表,因此当您输入 contours.

时会出错

您可以通过将 contours 展平为单个点列表来解决它,如下所示:

contours_flat = np.vstack(contours).squeeze()
minArea = cv2.minAreaRect(contours_flat)

或者,您可以通过使用(idx 是轮廓的基于 0 的索引)获得 contours 列表中每个轮廓的 minAreaRect

minArea = cv2.minAreaRect(contours[idx])

你可以在这里看到更多关于等高线的信息:Contours, cv::findContours

关于 minAreaRect:cv::minAreaRect