|
|
import math
|
|
|
import model
|
|
|
import calc_way
|
|
|
from scipy import stats
|
|
|
|
|
|
model = model.Model()
|
|
|
alpha = model.alpha
|
|
|
beta = model.beta
|
|
|
q = model.q
|
|
|
"""
|
|
|
计算地面点的竖直垂线在图像中的斜率
|
|
|
参数:点在图像中的坐标x、y,相机的外部偏转角参数alpha、beta
|
|
|
返回值:斜率k
|
|
|
"""
|
|
|
def get_k(alpha,beta,x,y):
|
|
|
gamma = math.atan(1 / (math.tan(alpha) * math.tan(beta)))
|
|
|
seta = math.atan(1 / math.sqrt(pow(math.tan(beta), 2) + 1 / pow(math.tan(alpha), 2)))
|
|
|
Xw,Yw = calc_way.calc_distance(x,y,alpha,beta)
|
|
|
u = Xw * math.cos(gamma) - Yw * math.sin(gamma)
|
|
|
v = Xw * math.sin(gamma) + Yw * math.cos(gamma)
|
|
|
tanlamda = -v/u/math.sqrt(1+(math.tan(math.pi/2-seta))**2)
|
|
|
lamda = math.atan(tanlamda)
|
|
|
k = math.tan(math.pi/2-lamda)
|
|
|
return k
|
|
|
|
|
|
def get_k2(alpha,beta,Xw,Yw):
|
|
|
gamma = math.atan(1 / (math.tan(alpha) * math.tan(beta)))
|
|
|
seta = math.atan(1 / math.sqrt(pow(math.tan(beta), 2) + 1 / pow(math.tan(alpha), 2)))
|
|
|
u = Xw * math.cos(gamma) - Yw * math.sin(gamma)
|
|
|
v = Xw * math.sin(gamma) + Yw * math.cos(gamma)
|
|
|
tanlamda = -v / u / math.sqrt(1 + (math.tan(math.pi / 2 - seta)) ** 2)
|
|
|
lamda = math.atan(tanlamda)
|
|
|
k = math.tan(math.pi / 2 - lamda)
|
|
|
return k
|
|
|
|
|
|
"""
|
|
|
计算地面点的竖直垂线在图像中的截距
|
|
|
参数:点在图像中的坐标x、y,斜率k
|
|
|
返回值:截距b
|
|
|
"""
|
|
|
def get_b(x,y,k):
|
|
|
b = y - x * k
|
|
|
return b
|
|
|
|
|
|
|
|
|
"""
|
|
|
将检测到的路沿上侧数据点拟合为一条直线
|
|
|
参数:上侧数据点坐标x_top,y_top
|
|
|
返回值:拟合出直线的斜率slope、截距intercept、r方值
|
|
|
"""
|
|
|
def linear_regression(x, y):
|
|
|
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
|
|
|
return slope, intercept, abs(r_value)
|
|
|
|
|
|
"""
|
|
|
计算图像中两条直线的交点
|
|
|
参数: line1: 第一条直线的系数 (A1, B1, C1)
|
|
|
line2: 第二条直线的系数 (A2, B2, C2)
|
|
|
返回值:交点在图像中的二维坐标x、y
|
|
|
"""
|
|
|
def find_intersection(line1, line2):
|
|
|
A1, B1, C1 = line1
|
|
|
A2, B2, C2 = line2
|
|
|
|
|
|
# 计算行列式
|
|
|
denominator = A1 * B2 - A2 * B1
|
|
|
|
|
|
if denominator == 0:
|
|
|
# 直线平行或重合
|
|
|
return None
|
|
|
else:
|
|
|
x = (B1 * C2 - B2 * C1) / denominator
|
|
|
y = (A2 * C1 - A1 * C2) / denominator
|
|
|
return (x, y)
|