是否可以使用函数cv2.HoughCircles
在要查找圆的地方划定x,y坐标?
我想找到我点击的圈子;使用cv2.setMouseCallback
保存鼠标位置,但是我不知道必须传递给cv2.HoughCircles
。
cv2.HoughCircles
返回具有[Xposition,Yposition,radius]的数组。
我想也许我可以使用第一个和第二个参数,但是我不知道如何访问它们,因为当我写print(circles[0])
时,会出现三个值。
当我写print(x)
时,返回错误消息“分配前引用的局部变量'x'” 。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
您是否要获得以cv2.setMouseCallback(方法2)给定的圆心,还是要在cv2.setMouseCallback该区域附近的圆(方法1)。
在传递到houghCircles函数之前裁剪图像 crop_img = img [y-h:y + h,x-w:x + w] 其中x和y是cv2.setMouseCallback返回的值。 您可以根据要使用多少区域来查找圆而改变(h,w)
为整个图像运行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作为图片,我得到了这个搜索区域:
结果如下: