65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
import math
|
|
import numpy as np
|
|
|
|
|
|
def pointAngle(Apoint, Bpoint):
|
|
angle = (Bpoint[1] - Apoint[1]) / ((Bpoint[0] - Apoint[0]) + 10e-8)
|
|
return angle
|
|
|
|
def pointDistance(Apoint, Bpoint):
|
|
return math.sqrt((Bpoint[1] - Apoint[1])**2 + (Bpoint[0] - Apoint[0])**2)
|
|
|
|
def lineBiasAndK(Apoint, Bpoint):
|
|
|
|
K = pointAngle(Apoint, Bpoint)
|
|
B = Apoint[1] - K*Apoint[0]
|
|
return K, B
|
|
|
|
def getX(K, B, Ypoint):
|
|
return int((Ypoint-B)/K)
|
|
|
|
def sidePoint(Apoint, Bpoint, h, w, placehold, enlarge_size):
|
|
|
|
K, B = lineBiasAndK(Apoint, Bpoint)
|
|
angle = abs(math.atan(pointAngle(Apoint, Bpoint)))
|
|
distance = pointDistance(Apoint, Bpoint)
|
|
|
|
x_enlarge_size, y_enlarge_size = enlarge_size
|
|
|
|
XaxisIncreaseDistance = abs(math.cos(angle) * x_enlarge_size * distance)
|
|
YaxisIncreaseDistance = abs(math.sin(angle) * y_enlarge_size * distance)
|
|
|
|
if placehold == 'leftTop':
|
|
x1 = max(0, Apoint[0] - XaxisIncreaseDistance)
|
|
y1 = max(0, Apoint[1] - YaxisIncreaseDistance)
|
|
elif placehold == 'rightTop':
|
|
x1 = min(w, Bpoint[0] + XaxisIncreaseDistance)
|
|
y1 = max(0, Bpoint[1] - YaxisIncreaseDistance)
|
|
elif placehold == 'rightBottom':
|
|
x1 = min(w, Bpoint[0] + XaxisIncreaseDistance)
|
|
y1 = min(h, Bpoint[1] + YaxisIncreaseDistance)
|
|
elif placehold == 'leftBottom':
|
|
x1 = max(0, Apoint[0] - XaxisIncreaseDistance)
|
|
y1 = min(h, Apoint[1] + YaxisIncreaseDistance)
|
|
return int(x1), int(y1)
|
|
|
|
def enlargebox(box, h, w, enlarge_size, horizontal_text_bool):
|
|
|
|
if not horizontal_text_bool:
|
|
enlarge_size = (enlarge_size[1], enlarge_size[0])
|
|
|
|
box = np.roll(box, -np.argmin(box.sum(axis=1)), axis=0)
|
|
|
|
Apoint, Bpoint, Cpoint, Dpoint = box
|
|
K1, B1 = lineBiasAndK(box[0], box[2])
|
|
K2, B2 = lineBiasAndK(box[3], box[1])
|
|
X = (B2 - B1)/(K1 - K2)
|
|
Y = K1 * X + B1
|
|
center = [X, Y]
|
|
|
|
x1, y1 = sidePoint(Apoint, center, h, w, 'leftTop', enlarge_size)
|
|
x2, y2 = sidePoint(center, Bpoint, h, w, 'rightTop', enlarge_size)
|
|
x3, y3 = sidePoint(center, Cpoint, h, w, 'rightBottom', enlarge_size)
|
|
x4, y4 = sidePoint(Dpoint, center, h, w, 'leftBottom', enlarge_size)
|
|
newcharbox = np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]])
|
|
return newcharbox |