我在计算缺少的矩形坐标时遇到问题。给定矩形的两个点,例如P1和P2(图像上的蓝色圆圈),我需要计算丢失的坐标P0和P3。矩形的大小是预定义的,我知道P0和P1之间以及P1和P2之间的距离。
例如,下面是定义矩形的坐标,但是假设第一个点和最后一个点(p0和p3)是未知的,我会尝试找到它们。
Len1 = 503 Len2 = 752
[(61,61),(564,55),(573,807),(70,817)]
我写了一个基于P1和P2计算P0的代码,但是看起来很丑,我觉得必须有更好的方法。我的目标远非能够根据其他两个可用点(这将有所不同)得出任何两个缺失点。除此之外,还有一个问题,就是对象的方向可能会有所不同。该功能应识别出,即使图像上下颠倒放置,P0始终位于左上角等。
这是我到目前为止所做的
import math
def calcAngle2Vectors(p0,p1,p2):
#calculates angle between two vectors
#p1 is a centre point
a = (p1[0]-p0[0])**2 + (p1[1]-p0[1])**2
b = (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2
c = (p2[0]-p0[0])**2 + (p2[1]-p0[1])**2
ang = math.acos( (a+b-c) / math.sqrt(4*a*b) ) * 180/math.pi
return ang
def interpolateMissingPoints():
# in real case one or two coords will be NaN e.g.
# coords = [Nan, (564.0, 55.0), (573.0, 807.0), Nan]
coords = [(61.0, 61.0), (564.0, 55.0), (573.0, 807.0), (70.0, 817.0)]
#Other coords of the same object under different angles:
#coords = [(809.0, 61.0), (815.0, 564.0), (63.0, 573.0), (53.0, 70.0)]
#coords = [(558.0, 809.0), (55.0, 815.0), (46.0, 63.0), (549.0, 53.0)]
#coords = [(61.0, 558.0), (55.0, 55.0), (807.0, 46.0), (817.0, 549.0)]
#calculate the angle of the
point_A = coords[1]
point_B = coords[2]
point_C = (0,coords[2][1])
angle = (calcAngle2Vectors(point_A,point_B,point_C))-90
Len1 = 503
if point_A[1] > point_B[1]:
#orientation - normal
x2 = int(coords[1][0] + math.cos(math.radians(angle)) * Len1)
y2 = int(coords[1][1] - math.sin(math.radians(angle)) * Len1)
else:
#orientation - upside down
x2 = int(coords[1][0] - math.cos(math.radians(angle)) * Len1)
y2 = int(coords[1][1] - math.sin(math.radians(angle)) * Len1)
print ("x2 "+ str(x2))
print ("y2 "+ str(y2))
interpolateMissingPoints()
关于如何实现这一目标的任何想法?