代码之家  ›  专栏  ›  技术社区  ›  Sam

cv2错误。Minarealect,给出了与凸包函数相关的错误,我没有使用凸包函数

  •  2
  • Sam  · 技术社区  · 7 年前

    在下面的代码中,我试图找出一个物体的颜色是否为绿色,并在其周围绘制一个轮廓。有了这些信息,我也想找到形状的角并裁剪它,但我得到了一个与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()
    

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

    任何帮助都将不胜感激

    提前感谢

    -山姆

    3 回复  |  直到 7 年前
        1
  •  2
  •   Maghoumi    4 年前

    如果其他人使用看似有效的输入出现此错误,请在此处发布:

    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
  •  1
  •   openTankist GatorGuy    7 年前

    这里有一段代码作为说明。它计算轮廓阵列中所有单独轮廓的边界框,并将其存储在列表中。

    rectangles = []
    for cont in contour:
        rectangles.append(cv2.minAreaRect(cont))
    
        3
  •  1
  •   SylphFeather    3 年前

    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_cnt 与完全相同 a . 但没有出现错误 angleA 虽然 angle0 收到与作者相同的错误。

    from_cnt.copy() 没有帮助。

    看起来不同的是

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

    改变 来自cnt dtype np.int64 具有 from_cnt.astype(np.int64) 工作。