185 lines
3.1 KiB
Python
185 lines
3.1 KiB
Python
|
|
# -*- coding: UTF-8 -*-
|
|||
|
|
#!/usr/bin/env python
|
|||
|
|
# -*- encoding: utf-8 -*-
|
|||
|
|
'''
|
|||
|
|
@File : 多边形等距缩放.py
|
|||
|
|
@data :2021/7/5 15:53
|
|||
|
|
@Desciption :
|
|||
|
|
@Version :
|
|||
|
|
@License :
|
|||
|
|
'''
|
|||
|
|
|
|||
|
|
import cv2
|
|||
|
|
import numpy as np
|
|||
|
|
def scale(data, sec_dis):
|
|||
|
|
"""多边形等距缩放
|
|||
|
|
Args:
|
|||
|
|
data: 多边形按照逆时针顺序排列的的点集
|
|||
|
|
sec_dis: 缩放距离
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
缩放后的多边形点集
|
|||
|
|
"""
|
|||
|
|
num = len(data)
|
|||
|
|
scal_data = []
|
|||
|
|
for i in range(num):
|
|||
|
|
x1 = data[(i) % num][0] - data[(i - 1) % num][0]
|
|||
|
|
y1 = data[(i) % num][1] - data[(i - 1) % num][1]
|
|||
|
|
x2 = data[(i + 1) % num][0] - data[(i) % num][0]
|
|||
|
|
y2 = data[(i + 1) % num][1] - data[(i) % num][1]
|
|||
|
|
|
|||
|
|
d_A = (x1 ** 2 + y1 ** 2) ** 0.5
|
|||
|
|
d_B = (x2 ** 2 + y2 ** 2) ** 0.5
|
|||
|
|
|
|||
|
|
Vec_Cross = (x1 * y2) - (x2 * y1)
|
|||
|
|
if (d_A * d_B==0):
|
|||
|
|
continue
|
|||
|
|
sin_theta = Vec_Cross / (d_A * d_B)
|
|||
|
|
if (sin_theta==0):
|
|||
|
|
continue
|
|||
|
|
dv = sec_dis / sin_theta
|
|||
|
|
|
|||
|
|
v1_x = (dv / d_A) * x1
|
|||
|
|
v1_y = (dv / d_A) * y1
|
|||
|
|
|
|||
|
|
v2_x = (dv / d_B) * x2
|
|||
|
|
v2_y = (dv / d_B) * y2
|
|||
|
|
|
|||
|
|
PQ_x = v1_x - v2_x
|
|||
|
|
PQ_y = v1_y - v2_y
|
|||
|
|
|
|||
|
|
Q_x = data[(i) % num][0] + PQ_x
|
|||
|
|
Q_y = data[(i) % num][1] + PQ_y
|
|||
|
|
scal_data.append([Q_x, Q_y])
|
|||
|
|
return scal_data
|
|||
|
|
|
|||
|
|
|
|||
|
|
data = [[454 , 76],
|
|||
|
|
[448 ,78],
|
|||
|
|
[444, 81],
|
|||
|
|
[440 , 85],
|
|||
|
|
[438, 90],
|
|||
|
|
[437, 96],
|
|||
|
|
[436 ,101],
|
|||
|
|
[434, 107],
|
|||
|
|
[432 ,112],
|
|||
|
|
[431 ,117],
|
|||
|
|
[430 ,123],
|
|||
|
|
[429, 129],
|
|||
|
|
[428, 134],
|
|||
|
|
[427, 140],
|
|||
|
|
[427, 145],
|
|||
|
|
[427, 151],
|
|||
|
|
[427 ,157],
|
|||
|
|
[427 ,163],
|
|||
|
|
[427, 169],
|
|||
|
|
[427, 175],
|
|||
|
|
[427, 181],
|
|||
|
|
[427, 187],
|
|||
|
|
[428, 193],
|
|||
|
|
[428 ,199],
|
|||
|
|
[429, 204],
|
|||
|
|
[429, 210],
|
|||
|
|
[429 ,216],
|
|||
|
|
[430, 222],
|
|||
|
|
[431, 227],
|
|||
|
|
[431, 233],
|
|||
|
|
[431, 239],
|
|||
|
|
[432, 245],
|
|||
|
|
[433, 250],
|
|||
|
|
[434, 256],
|
|||
|
|
[435 ,261],
|
|||
|
|
[436 ,267],
|
|||
|
|
[437 ,272],
|
|||
|
|
[438, 278],
|
|||
|
|
[439, 283],
|
|||
|
|
[441, 289],
|
|||
|
|
[442, 294],
|
|||
|
|
[443, 300],
|
|||
|
|
[445, 305],
|
|||
|
|
[446, 310],
|
|||
|
|
[448, 316],
|
|||
|
|
[450, 321],
|
|||
|
|
[453, 330],
|
|||
|
|
[461, 334],
|
|||
|
|
[466, 336],
|
|||
|
|
[471, 338],
|
|||
|
|
[477 ,340],
|
|||
|
|
[482, 340],
|
|||
|
|
[488, 341],
|
|||
|
|
[494, 341],
|
|||
|
|
[500, 341],
|
|||
|
|
[506 ,341],
|
|||
|
|
[511 ,340],
|
|||
|
|
[517, 339],
|
|||
|
|
[523 ,338],
|
|||
|
|
[528, 337],
|
|||
|
|
[533, 335],
|
|||
|
|
[539, 333],
|
|||
|
|
[544, 331],
|
|||
|
|
[549, 329],
|
|||
|
|
[553, 326],
|
|||
|
|
[558, 322],
|
|||
|
|
[562, 318],
|
|||
|
|
[566, 313],
|
|||
|
|
[568, 308],
|
|||
|
|
[569, 303],
|
|||
|
|
[570, 297],
|
|||
|
|
[570, 291],
|
|||
|
|
[569, 285],
|
|||
|
|
[569, 280],
|
|||
|
|
[568, 274],
|
|||
|
|
[567, 268],
|
|||
|
|
[566 ,263],
|
|||
|
|
[566 ,257],
|
|||
|
|
[564 ,252],
|
|||
|
|
[564 ,246],
|
|||
|
|
[562, 241],
|
|||
|
|
[561, 235],
|
|||
|
|
[560, 230],
|
|||
|
|
[560, 224],
|
|||
|
|
[558 ,219],
|
|||
|
|
[558, 213],
|
|||
|
|
[556, 207],
|
|||
|
|
[555, 202],
|
|||
|
|
[554, 196],
|
|||
|
|
[553, 191],
|
|||
|
|
[552, 185],
|
|||
|
|
[550, 180],
|
|||
|
|
[549, 174],
|
|||
|
|
[548, 169],
|
|||
|
|
[547 ,164],
|
|||
|
|
[545 ,158],
|
|||
|
|
[543 ,153],
|
|||
|
|
[541 ,148],
|
|||
|
|
[539 ,143],
|
|||
|
|
[536 ,138],
|
|||
|
|
[533 ,133],
|
|||
|
|
[530, 128],
|
|||
|
|
[528 ,124],
|
|||
|
|
[524 ,119],
|
|||
|
|
[520 ,115],
|
|||
|
|
[515, 111],
|
|||
|
|
[511, 108],
|
|||
|
|
[506 ,106],
|
|||
|
|
[501 ,104],
|
|||
|
|
[495 ,102],
|
|||
|
|
[490, 101],
|
|||
|
|
[485 , 99],
|
|||
|
|
[480 , 97],
|
|||
|
|
[475 , 93],
|
|||
|
|
[471 , 89],
|
|||
|
|
[468 , 84],
|
|||
|
|
[465, 80],
|
|||
|
|
[460 , 76]]
|
|||
|
|
|
|||
|
|
data1 = scale(data,-100)
|
|||
|
|
print(data1)
|
|||
|
|
temp = np.ones((1300,1000,3), np.uint8) * 255
|
|||
|
|
#cv2.polylines(temp, data1, 1, 255)
|
|||
|
|
cv2.polylines(temp , [np.array(data , dtype=np.int32)], True, (255, 0, 0), 1)
|
|||
|
|
cv2.polylines(temp , [np.array(data1 , dtype=np.int32)], True, (0, 0, 255), 1)
|
|||
|
|
cv2.imshow ("img",temp)
|
|||
|
|
cv2.imwrite("1.jpg",temp)
|
|||
|
|
cv2.waitKey(0)
|