我正在尝试实施此等式,以便从三个用户选择的点确定圆的中心:http://en.wikipedia.org/wiki/Circumscribed_circle#Cartesian_coordinates
首先,通过此OpenCV鼠标回调函数获取点并将其组合成一个列表:
def setupPoints(event, x, y, flags, points):
#Populates a provided list 'points' with
#three coordinates representing the edge of
#a circle
if points[0] == 0:
points[0] = (x,y)
elif points[1] == 0:
points[1] = (x,y)
else:
points[2] = (x,y)
然后我将点列表传递给这个函数,它完成了工作:
def findCircle(p):
#Returns the circle centre
#from three provided points provided as tuples
#in a list
#See http://en.wikipedia.org/wiki/Circumscribed_circle#Cartesian_coordinates
ax = float(p[0][0])
ay = float(p[0][1])
bx = float(p[1][0])
by = float(p[1][1])
cx = float(p[2][0])
cy = float(p[2][1])
d = 2*(ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))
centrex = ((pow(ax,2)+pow(ay,2))*(by-cy)+(pow(bx,2)+pow(by,2))*(cy-ay)+(pow(cx,2)+pow(cy,2))*(ay-by))/d
centrey = ((pow(ax,2)+pow(ay,2))*(cx-bx)+(pow(bx,2)+pow(by,2))*(ax-cx)+(pow(cx,2)+pow(cy,2))*(bx-ax))/d
return (int(round(centrex)), int(round(centrey)), int(round(d)))
然而,它不起作用。返回的数字并没有大量关闭,但它们肯定是不正确的。这可能与OpenCV使用的坐标系的起源位于图像的左上角这一事实有关(图像中的点仍然是正的,因此可以说是向后计数',垂直至少)。
或者猜错了?
答案 0 :(得分:2)
很可能是因为你的除法的操作数都是整数,所以结果是(浮点)整数。在Python中,2/3 == 0
。由于它们不能正确舍入,这会稍微甩掉你的计算。尝试除以float(d)
而不只是d
。
答案 1 :(得分:0)
关于我的问题(从数学的角度来看,不是计算机图形学的观点)坐标系是否阻止它工作的问题的答案是否定的。
我只是忘了在我的鼠标回调功能中添加一个检查,以确保该事件是一次点击,而不仅仅是鼠标移动;我的观点不是我点击的内容!
感谢您关注此事,也许这将有助于将来的某个人......