左上角的原点坐标系是什么阻止了这个方程的运作?

时间:2012-04-17 19:43:14

标签: python math opencv

我正在尝试实施此等式,以便从三个用户选择的点确定圆的中心: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使用的坐标系的起源位于图像的左上角这一事实有关(图像中的点仍然是正的,因此可以说是向后计数',垂直至少)。

或者猜错了?

2 个答案:

答案 0 :(得分:2)

很可能是因为你的除法的操作数都是整数,所以结果是(浮点)整数。在Python中,2/3 == 0。由于它们不能正确舍入,这会稍微甩掉你的计算。尝试除以float(d)而不只是d

答案 1 :(得分:0)

关于我的问题(从数学的角度来看,不是计算机图形学的观点)坐标系是否阻止它工作的问题的答案是否定的。

我只是忘了在我的鼠标回调功能中添加一个检查,以确保该事件是一次点击,而不仅仅是鼠标移动;我的观点不是我点击的内容!

感谢您关注此事,也许这将有助于将来的某个人......