【问题标题】:python opencv - HoughCircles error after pixel manipulationpython opencv - 像素操作后的HoughCircles错误
【发布时间】:2017-02-06 10:15:09
【问题描述】:
def detect_circles():
    img = cv2.imread('img.JPG', 0)
    #img = cv2.medianBlur(img, 3)
    #cim= cv2.GaussianBlur(img, (15, 15), 0)
    cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

    circles = cv2.HoughCircles(img, cv2.cv.CV_HOUGH_GRADIENT, 1, 30,param1=100,param2=39,minRadius=25,maxRadius=70)
    circles = np.uint16(np.around(circles))
    count = 0
    for i in circles[0, :]:
        count = count + 1
        # draw the outer circle
        cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
        # draw the center of the circle
        cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)

    cv2.imwrite('circles_detected.JPG', cimg)
    print(count)

此功能旨在检测图像中的圆圈。 它工作正常,但我需要区分颜色。 所以我写了这个函数,它将每个像素的 G 和 R 值设置为 0。

def iterate_image():
    img = read_img('SDC10004.JPG')
    height = img.shape[0]
    width = img.shape[1]
    for i in range(height):
        for j in range(width):
            #img.itemset((i,j, 0), 100)
            img.itemset((i,j, 1), 0)
            img.itemset((i,j, 2), 0)

    write_img(img,'SDC10004_selfmade_blue.JPG')

当我尝试使用蓝色像素图像检测圆圈时,我收到以下错误消息:

Traceback (most recent call last):
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 107, in <module>
detect_circles();
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 94, in detect_circles
circles = np.uint16(np.around(circles))
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 2610, in around
return _wrapit(a, 'round', decimals, out)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 43, in _wrapit
result = getattr(asarray(obj), method)(*args, **kwds)
AttributeError: rint

以前有人遇到过这个吗?

【问题讨论】:

  • 您是否尝试在 cv2.HoughCircles 之后打印圆圈 以查看得到了什么?
  • 是的。在我操纵像素之前,我在图像中绘制了圆圈并且它起作用了
  • 处理像素后我收到错误消息
  • 从你的错误 AttributeError: rint 我会尝试this 解决方案。所以对你来说它是 circles = np.uint16(np.around(circles.astype(double)))。并不是说它实际上回答了为什么一张图片与另一张不同......
  • 感谢您的帮助。我试过了,但现在有一个不同的错误: circles = np.uint16(np.around(circles.astype(np.double))) AttributeError: 'NoneType' object has no attribute 'astype'

标签: python opencv geometry hough-transform


【解决方案1】:

所以,我相信我发现了这里的问题。

HoughCircles 并不棘手,您只需要小心它的参数化。该方法基于 Canny 边缘检测器,进而对灰度图像进行阈值处理。

opencv 用于灰度图像的formula 由以下公式给出:

RGB_to_Gray: 0.299.R + 0.587.G + 0.114.B

由于您将三个 RGB 通道中的两个归零,因此灰度值的强度会降低。因此,您的阈值会避免任何圆形检测,并且 cv2.HoughCircles 返回 None。因此,由于您没有测试 circles 是否属于 None 类型,因此当您尝试执行 np.around(None)强>.

调整 cv2.HoughCircles 上的 param1 应该可以解决问题。

param1 – 第一个特定于方法的参数。在 CV_HOUGH_GRADIENT 的情况下 ,它是传递给 Canny() 边缘的两者中较高的阈值 检测器(下面的小一倍)

HoughCircles param1 source.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多