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.

186 lines
6.6 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 numpy as np
import matplotlib.pyplot as plt
import calc_way
import get_data
import calc_slope_line
import cv2
import model
import os
# model = model.Model()
# x,y=calc_way.calc_distance(model.tire_x, model.tire_y,model.alpha,model.beta)
# print(x,y)
# img_path = r'C:\Users\Administrator\Desktop\BYD\20250520\frame_7800_2_yolo.jpg'
# x_zero, y_zero = calc_way.calc_zeros_xto0()
# x_zero = np.array(x_zero)
# y_zero = np.array(y_zero)
# print(x_zero,y_zero)
# image = cv2.imread(img_path) # 默认读取BGR格式
# point1 = (int(x_zero[0]), int(960 - y_zero[0]))
# point2 = (int(x_zero[-1]), int(960 - y_zero[-1]))
# cv2.line(image, point1, point2, (0, 0, 255), 2)
# cv2.imshow("Image with Line", image)
# cv2.waitKey(0) # 按任意键关闭窗口
# cv2.destroyAllWindows()
model = model.Model()
alpha = model.alpha
beta = model.beta
img_path = r'C:\Users\Administrator\Desktop\BYD\20250520\frame_7800_2_yolo.jpg'
txt_name = "C:\\Users\\Administrator\\Desktop\\BYD\\20250520\\frame_7800_2.jpg_zuobiao.txt"
output_folder = 'C:\\Users\\Administrator\\Desktop\\BYD\\Visual measurement\\pic\\7800'
def vs_measurement(txt_name):
os.makedirs(output_folder, exist_ok=True)
# 获取数据
x_bot, y_bot, x_top, y_top = get_data.get_data(txt_name)
x_bot = np.array(x_bot)
y_bot = np.array(y_bot)
x_top = np.array(x_top)
y_top = np.array(y_top)
# 拟合路沿上下直线方程
slope_bot, intercept_bot ,r2_bot = calc_slope_line.linear_regression(x_bot, y_bot)
slope_top, intercept_top ,r2_top = calc_slope_line.linear_regression(x_top,y_top)
# 拟合车轮垂线方程
x_zero_xto0, y_zero_xto0 = calc_way.calc_zeros_xto0()
x_zero_xto0 = np.array(x_zero_xto0)
y_zero_xto0 = np.array(y_zero_xto0)
slope_zero_xto0, intercept_zero_xto0,r2_zero_xto0 = calc_slope_line.linear_regression(x_zero_xto0, y_zero_xto0)
# 拟合X轴线方程
x_zero, y_zero = calc_way.calc_zeros_yto0()
x_zero = np.array(x_zero)
y_zero = np.array(y_zero)
print(x_zero,y_zero)
slope_zero, intercept_zero, r2_zero = calc_slope_line.linear_regression(x_zero, y_zero)
# 计算路沿底部与车轮垂线得交点
x_jiao, y_jiao =calc_slope_line.find_intersection((slope_bot,-1,intercept_bot),(slope_zero_xto0,-1,intercept_zero_xto0))
# # 绘制原始数据
# plt.scatter(x_top,y_top, color='blue', label='orgin')
#
# # 绘制拟合线
# y_pred = slope_top * x_top + intercept_top
# plt.plot(x_top, y_pred, color='red', label='fix')
#
# plt.xlabel('X')
# plt.ylabel('Y')
# plt.legend()
# plt.show()
Z = 0
Y = 0
max_Zw = 0
max_Zw_index = 0
min_Zw = 0
min_Zw_index = 0
max_Yw = 0
max_Yw_index = 0
min_Yw = 0
min_Yw_index = 0
Xw_bot = []
Yw_bot = []
for i in range(len(x_bot)):
image = cv2.imread(img_path) # 默认读取BGR格式
if image is None:
print("Error: 无法读取图像,请检查路径!")
exit()
# 定义点的坐标 (x, y)
point = (int(x_jiao), 960-int(y_jiao))
# 画一个红色圆点半径5颜色BGR格式线宽-1表示填充
cv2.circle(image, point, 5, (0, 0, 255), -1)
point1 = (int(x_zero[0]), int(960 - y_zero[0]))
point2 = (int(x_zero[-1]), int(960 - y_zero[-1]))
cv2.line(image, point1, point2, (0, 0, 255), 2)
point1 = (int(x_zero_xto0[0]), int(960 - y_zero_xto0[0]))
point2 = (int(x_zero_xto0[-1]), int(960 - y_zero_xto0[-1]))
cv2.line(image, point1, point2, (0, 255, 255), 2)
k = calc_slope_line.get_k(alpha,beta,x_bot[i],y_bot[i])
b = calc_slope_line.get_b(x_bot[i],y_bot[i],k)
x = (intercept_top - b) / (k - slope_top)
y = k * x + b
Zw = calc_way.calc_height(x_bot[i],y_bot[i], x, y, alpha, beta)
Xw, Yw = calc_way.calc_distance(x_bot[i],y_bot[i], alpha, beta)
Xw_bot.append(Xw)
Yw_bot.append(Yw)
if i == 0:
max_Zw = Zw
min_Zw = Zw
max_Yw = Yw
min_Yw = Yw
else:
if Zw > max_Zw:
max_Zw = Zw
max_Zw_index = i
if Zw < min_Zw:
min_Zw = Zw
min_Zw_index = i
if Yw > max_Yw:
max_Yw = Yw
max_Yw_index = i
if Yw < min_Yw:
min_Yw = Yw
min_Yw_index = i
point1 = (x_bot[i], 960-y_bot[i])
point2 = (int(x), 960-int(y))
cv2.line(image, point1, point2, (0, 255, 0), 1)
text = f"Xw,Yw:{int(Xw),int(Yw)},Zw:{int(Zw)}"
position = (int(x), 960-int(y))
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
color = (0, 0, 255)
thickness = 2
cv2.putText(image, text, position, font, font_scale, color, thickness, cv2.LINE_AA)
output_path = os.path.join(output_folder, f'{i+1}.jpg')
cv2.imwrite(output_path, image)
Z = Z + Zw
Y = Y + Yw
file_path = os.path.join(output_folder, 'data.txt')
with open(file_path, 'w', encoding='utf-8') as file:
file.write("该图片数据如下\n")
file.write(f"路沿平均高度为:{Z/len(x_bot)}\n")
file.write(f"最大高度为图{max_Zw_index+1},高度为:{max_Zw}\n")
file.write(f"最小高度为图{min_Zw_index+1},高度为:{min_Zw}\n")
file.write(f"路沿距离车辆平均距离为:{-Y/len(x_bot)}\n")
file.write(f"最远距离为图{min_Yw_index + 1},距离为:{min_Yw}\n")
file.write(f"最近距离为图{max_Yw_index + 1},距离为:{max_Yw}\n")
# 计算路沿与车的夹角
slope_Xw ,intercept_Xw ,r2_Xw = calc_slope_line.linear_regression(Xw_bot, Yw_bot)
angle = math.atan(slope_Xw)
Xw , Yw = calc_way.calc_distance(x_jiao, y_jiao, alpha, beta)
distance = -Yw * math.cos(angle)
distance_door = (-intercept_Xw/slope_Xw)/ ((-intercept_Xw/slope_Xw)-Xw)*distance
image = cv2.imread(img_path) # 默认读取BGR格式
if image is None:
print("Error: 无法读取图像,请检查路径!")
exit()
cv2.circle(image, point, 5, (0, 0, 255), -1)
text = f"Xw,Yw:{int(Xw), int(Yw)},distance:{int(distance)},distance_door:{int(distance_door)}"
position = (int(x_jiao), 960 - int(y_jiao))
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.5
color = (0, 0, 255)
thickness = 2
cv2.putText(image, text, position, font, font_scale, color, thickness, cv2.LINE_AA)
cv2.imshow("Image with Line", image)
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
vs_measurement(txt_name)