已知图片中一组四边形的坐标和真实长宽,求其中的另一个四边形的坐标。例如下图中的机箱。
我们已知机箱侧面的长高,记为l,h。已知箱面四角坐标(左上起至左下顺时针旋转)列表表示为[x1,y1…x4,y4],已知通风口四角列表表示[x1,y1…x4,y4]。
可以根据ProjectiveTransform 进行运算。
from skimage.transform import ProjectiveTransform
def map_ture(l, h, polygon, box):
"""
l,h:箱面真实长高;
polygon:箱面坐标列表
box:通风口四角坐标
"""
# 构建映射关系t
t = ProjectiveTransform()
# 箱面的四个角
src = np.asarray(
[[polygon[1], polygon[2]], [polygon[3], polygon[4]], [polygon[5], polygon[6]], [polygon[7], polygon[8]]])
dst = np.asarray([[0, 0], [l, 0], [l, h], [0, h]]) # 需要映射成的矩形
# 得出映射关系t
if not t.estimate(src, dst): raise Exception("estimate failed")
# 通风口四角坐标 本次简化。可以输入多组坐标,根据np.asarray().reshape(int(len(box)/2),2)自动处理也可以。
data = np.asarray([
[box[1], box[2]],
[box[3], box[4]],
[box[5], box[6]],
[box[7], box[8]]
])
data_local = t(data)
return data_local # 得到的数组于原数组相同
根据上述,可得到通风口的四个角的坐标,由于原来为矩形,所以得出的为四边形的四个角,于实际情况会有差异。