You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)