私は3つのユーザーが選択した点から円の中心を決定するために、この式を実装しようとしています: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で使用される座標系が画像の左上に原点を持っているという事実(画像内の点は依然として正の値なので、少なくとも「後方」に数えていると言えるかもしれません。 )。
それは間違っていますか?
は、その後、あなたは間違った座標系のもので、入力番号に問題をピンすることができます...将来的に誰かを助けます。手動で数学を行い、答えを知り、数字を入力してください。間違った座標系で再度数値を入力してください。 – Paystey
あなたは、紙で最初にすべてをチェックしたはずだと言うのは間違いありません。それが起こったとき、関数は期待どおりに機能しましたが、少なくともチェックの後、問題がfindCircle関数にないと確信することができました。これにより解決策が見つけられました(下記参照) – Alex