划定cv2.houghCircles的位置

时间:2018-08-27 12:45:04

标签: python opencv

是否可以使用函数cv2.HoughCircles在要查找圆的地方划定x,y坐标?

我想找到我点击的圈子;使用cv2.setMouseCallback保存鼠标位置,但是我不知道必须传递给cv2.HoughCircles

cv2.HoughCircles返回具有[Xposition,Yposition,radius]的数组。

我想也许我可以使用第一个和第二个参数,但是我不知道如何访问它们,因为当我写print(circles[0])时,会出现三个值。

当我写print(x)时,返回错误消息“分配前引用的局部变量'x'”

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您是否要获得以cv2.setMouseCallback(方法2)给定的圆心,还是要在cv2.setMouseCallback该区域附近的圆(方法1)。

  1. 在传递到houghCircles函数之前裁剪图像 crop_img = img [y-h:y + h,x-w:x + w] 其中x和y是cv2.setMouseCallback返回的值。 您可以根据要使用多少区域来查找圆而改变(h,w)

  2. 为整个图像运行cv2.houghCircles之后,您将获得一个具有[Xposition,Yposition,radius]的数组。

    for( size_t i = 0; i < circles.size(); i++ ){
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
     int radius = cvRound(circles[i][2]);
    }
    

circles [i] [0]和circle [i] [1]给出圆心的x和y坐标。现在,您可以使用cv2.setMouseCallback过滤掉想要的圈子。

答案 1 :(得分:1)

无法提供坐标作为cv2.HoughCircles的输入来查找以该位置为中心的圆。您可以做的是处理返回的数组并提取包含坐标的圆。

如您所见,circles[0]的结果给出了x坐标,y坐标和半径的所有三个参数。要提取单个参数,您只需指定以下参数:

circles[0][0]将返回x坐标;
circles[0][1]将返回y坐标;和
circles[0][2]将返回半径。

您可以使用以下命令将所有这些代码存储在Python中:

x, y, r = circles[0]

实际上与写作相同

x = circles[0][0]
y = circles[0][1]
r = circles[0][2]

然后使用cv2.HoughCircles中的x和y坐标并单击鼠标,您可以检查哪些圆与所需结果匹配。

您可以使用圆的一般中心半径公式进行此操作

(x – h)^2 + (y – k)^2 = r^2

中心在(h,k)点处。

因此,如果(x – h)^2 + (y – k)^2 - r^2 > 0,则该点在圆之外;如果(x – h)^2 + (y – k)^2 - r^2 < 0,则该点在圆内(如果(x – h)^2 + (y – k)^2 - r^2 = 0,则该点在圆上)。 / p>

答案 2 :(得分:1)

HoughCircles的文档中说:

  

圆圈:找到的圆圈的输出向量。每个向量编码为3或   4个元素浮点向量(x,y,radius)或(x,y,radius,votes)

这意味着它是圆圈的向量。因此,要打印每个圆的所有x,y,半径,您可以执行以下操作:

for circle in circles:
  print ("(x,y) = (",circle[0],",",circle[1], ") and radius =", circle[2] )

或:

print ("(x,y) = (",circle[0][0],",",circle[0][1], ") and radius =", circle[0][2] )

打印第一个圆圈。

此外,对于鼠标位置,可以传递如下子图像:

# the position of the click as (x,y) 
mousePosition = (10,15)
# the size of the image you want to look when you click (width, height)
swz = (20,20)

#calculate the box top corner  so that is no less than 0 and the right bottom side less than image size

imgSize = img.shape
tl = (max(0, mousePosition[0] - (swz [0] / 2)), max(0, mousePosition[1] - (swz [1] / 2)))
tl = (min(tl[0], imgSize[1] - (swz [0] / 2)), min(tl[1], imgSize[0] - (swz [1] / 2)))
tl = (int(tl[0]), int(tl[1]))

circles =   cv.HoughCircles(img[tl[1]:swz[1]+tl[1], tl[0]:swz[0]+tl[0]], cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0   )

然后绘制它们:

# make sure it found anything and make them int
circles = None if circles is None else np.uint16(np.around(circles))
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
for i in circles[0,:]:
    # draw the outer circle
    cv.circle(cimg,(i[0]+tl[0],i[1]+tl[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv.circle(cimg,(i[0]+tl[0],i[1]+tl[1]),2,(0,0,255),3)

例如:

mousePosition = (100,170)
swz = (100,100)

和OpenCVlogo作为图片,我得到了这个搜索区域:

enter image description here

结果如下:

enter image description here