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.

252 lines
8.9 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
import time
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_6000_2.jpg_zuobiao.txt"
output_folder = 'C:\\Users\\Administrator\\Desktop\\BYD\\Visual measurement\\pic\\7800'
"""
计算图像中识别到的路沿距离车辆坐标原点的距离、高度信息
参数保存数据的txt文件路径
返回值:
"""
# 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_top, intercept_top ,r2 = calc_slope_line.linear_regression(x_top,y_top)
#
# x_zero, y_zero = calc_way.calc_zeros_yto0()
# x_zero = np.array(x_zero)
# y_zero = np.array(y_zero)
# slope_zero, intercept_zero, r2_zero = calc_slope_line.linear_regression(x_zero, y_zero)
#
# # # 绘制原始数据
# # 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
#
# for i in range(len(x_bot)):
# image = cv2.imread(img_path) # 默认读取BGR格式
# if image is None:
# print("Error: 无法读取图像,请检查路径!")
# exit()
#
# 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)
#
# 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)
# 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.0
# 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")
# 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_top, intercept_top ,r2 = calc_slope_line.linear_regression(x_top,y_top)
#
#
# 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
#
# for i in range(len(x_bot)):
# 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)
# 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
# Z = Z + Zw
# Y = Y + Yw
# return Z/len(x_bot),-max_Yw
def vs_measurement(txt_name,position):
# if not os.path.exists(txt_name):
# return None,None,None,None
# 获取数据
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)
# if not (x_bot or y_bot or x_top or y_top):
# return 1,1,1,1
# 拟合路沿上下直线方程
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)
slope_zero_xto0 = 0.6060163775784262
intercept_zero_xto0 = -16.33378114591926
# 计算路沿底部与车轮垂线的交点
x_intersection,y_intersection = calc_slope_line.find_intersection((slope_bot, -1, intercept_bot), (slope_zero_xto0, -1, intercept_zero_xto0))
#计算交点的位置信息
k = calc_slope_line.get_k(alpha, beta, x_intersection,y_intersection)
b = calc_slope_line.get_b(x_intersection, y_intersection, k)
x, y = calc_slope_line.find_intersection((k, -1, b), (slope_top, -1, intercept_top))
Zw_intersection = calc_way.calc_height(x_intersection, y_intersection, x, y, alpha, beta)
Xw_intersection, Yw_intersection = calc_way.calc_distance(x_intersection, y_intersection, alpha, beta)
Xw_bot = []
Yw_bot = []
for i in range(len(x_bot)):
Xw, Yw = calc_way.calc_distance(x_bot[i], y_bot[i], alpha, beta)
Xw_bot.append(Xw)
Yw_bot.append(Yw)
# 计算路沿与车的夹角
slope_Xw, intercept_Xw, r2_Xw = calc_slope_line.linear_regression(Xw_bot, Yw_bot)
angle = math.atan(slope_Xw)
# 计算给出postion的位置信息
Yw = slope_Xw * position + intercept_Xw
x_pos, y_pos = calc_way.calc_distance2(position, Yw, alpha, beta)
k_pos = calc_slope_line.get_k(alpha, beta, x_pos, y_pos)
b_pos = calc_slope_line.get_b(x_pos, y_pos, k_pos)
x_pos_top, y_pos_top = calc_slope_line.find_intersection((k_pos, -1, b_pos), (slope_top, -1, intercept_top))
Zw_pos = calc_way.calc_height(x_pos, y_pos, x_pos_top, y_pos_top, alpha, beta)
distance = -(Yw_intersection-model.distance) * math.cos(angle)
distance_pos = ((-intercept_Xw / slope_Xw) - position)/ ((-intercept_Xw / slope_Xw) - Xw_intersection) * distance
return Zw_intersection, distance, Zw_pos , distance_pos
if __name__ == '__main__':
# t=time.time()
# h, w = vs_measurement(r'C:\Users\Administrator\Desktop\BYD\Visual measurement\py\new.txt')
# print(h,w)
# print(f"time: {time.time() - t}")
# x_zero, y_zero = calc_way.calc_zeros()
# x_zero = np.array(x_zero)
# y_zero = np.array(y_zero)
# print(f"x_zero: {x_zero}")
# print(f"y_zero: {y_zero}")
t = time.time()
Zw_intersection, distance, Zw_pos, distance_pos = vs_measurement(r"C:\Users\Administrator\Desktop\BYD\git\measure_lib\py\new.txt",877)
# vs_measurement(txt_name)
print(f"time: {time.time() - t}")
print(Zw_intersection, distance, Zw_pos, distance_pos)