【问题标题】:Error with cv2.minAreaRect , gives me Error related to convex hull function which i haven't usedcv2.minAreaRect 出错,给了我与我没有使用过的凸包函数相关的错误
【发布时间】:2018-03-27 03:01:01
【问题描述】:

在下面的代码中,我试图找出一个对象是否为绿色并在其周围绘制轮廓。有了这些信息,我还想找到形状的角并裁剪它,但我得到了一个与代码中没有使用的 ConvexHull 函数相关的错误。我用过 python 3 和 Opencv 3.2.0

我写的代码给了我这个错误

Traceback (most recent call last):
  File "/home/pi/Desktop/SelfDrivingCar/code/picamsense2.py", line 29, in <module>
    points = cv2.minAreaRect(contour)
error: /home/pi/opencv/opencv-3.2.0/modules/imgproc/src/convhull.cpp:136: error: (-215) total >= 0 && (depth == CV_32F || depth == CV_32S) in function convexHull

这是我的代码

from picamera import PiCamera
import time
import cv2
import numpy as np 
camera = PiCamera()
camera.start_preview()
time.sleep(5)
camera.capture('/home/pi/Desktop/piImage/image.jpg')
camera.stop_preview()
img = cv2.imread('/home/pi/Desktop/piImage/image.jpg', 1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([46, 100, 100])
upper = np.array([86, 255, 255])
mask = cv2.inRange (hsv, lower, upper)
blur = cv2.GaussianBlur(mask, (7,5),0 )
erosion =cv2.erode(blur, (5,5), iterations = 3)
contour =np.array( cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[1])
cv2.drawContours(img, contour, -1, (0,255,0), 3)
for cnt in contour:
    approx = cv2.approxPolyDP(cnt, 0.04*cv2.arcLength(cnt, True), True)
    if len (approx)== 3:
        print "triangle"
    elif len (approx) == 4 :
        print "quadrilateral"
    elif len(approx) > 4:
        print "circle"        
points = cv2.minAreaRect(contour)
points = cv2.boxPoints(points)
points = np.int0(points)
for p in points :
    pt = (p[0],p[1])
    print pt
print points
cv2.imshow('eroded', blur)
cv2.imshow('original', img)
while (1):
    k = cv2.waitKey(0)
    if(k == 27):
     break
cv2.destroyAllWindows()

一段时间以来,我一直在努力寻找解决方法

任何帮助将不胜感激

提前感谢

-山姆

【问题讨论】:

  • "rotatedRect" 使用 rotating caliper 算法,该算法可能与凸包代码一起实现。请确保:1)您没有将空向量传递给rotatedRect,并且您的向量是int(CV_32S)或float(CV_32F)。此外,您不应该传递点数组(轮廓),而是点数组(如 cnt)

标签: python-3.x opencv raspberry-pi3 opencv3.0 opencv3.2


【解决方案1】:

在此处发布以防其他人使用看似有效的输入出现此错误:

在我的情况下,问题是由于将切片的 numpy 数组传递给 cv2.minAreaRect 函数(使用 vertex.shape = (4, 3) )引起的

# This won't work and will raise the following error:
# error: /io/opencv/modules/imgproc/src/convhull.cpp:137: error: (-215) total >= 0 && (depth == 5 || depth == 4) in function convexHull

cv2.minAreaRect(vertices[:, :2])

我必须传递数组的副本才能使其工作:

# This works fine!
cv2.minAreaRect(vertices[:, :2].copy())

这是一个奇怪的问题,我不确定为什么第二个有效。

【讨论】:

    【解决方案2】:

    您犯的错误是您将轮廓数组传递给需要轮廓的函数。

    这是一段代码作为说明。它计算轮廓数组中所有单独轮廓的边界框并将它们存储在一个列表中。

    rectangles = []
    for cont in contour:
        rectangles.append(cv2.minAreaRect(cont))
    

    【讨论】:

    • 谢谢大家帮了我很多
    • 很酷,但是您需要通过选择我的答案将您的问题标记为已回答。
    【解决方案3】:

    我收到了与@Maghoumi 类似的问题

    a = np.array([[176,52],[174,132],[94,92]])
    print(a==from_cnt, a.shape==from_cnt.shape)
    _, _, angleA = cv2.minAreaRect(a)
    _, _, angle0 = cv2.minAreaRect(from_cnt)
    

    产生以下打印语句

    [[ True  True]
     [ True  True]
     [ True  True]] True
    

    这表示from_cnta 完全相同。然而angleA 没有发生错误,而angle0 收到与作者相同的错误。

    在这种情况下,使用 from_cnt.copy() 没有帮助。

    看起来有什么区别

    print(a.dtype, from_cnt.dtype)
    
    int64 uint8
    

    from_cntdtype 更改为np.int64from_cnt.astype(np.int64) 有效。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多