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.

175 lines
5.5 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 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()
alpha = model.alpha
beta = model.beta
img_path = r'C:\Users\Administrator\Desktop\BYD\20250520\frame__9600_2_yolo.jpg'
txt_name = "C:\\Users\\Administrator\\Desktop\\BYD\\20250520\\frame_9600_2.jpg_zuobiao.txt"
output_folder = 'C:\\Users\\Administrator\\Desktop\\BYD\\Visual measurement\\pic\\9600'
"""
计算图像中识别到的路沿距离车辆坐标原点的距离、高度信息
参数保存数据的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()
# 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"路沿平均高度为:{}\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
if __name__ == '__main__':
vs_measurement(txt_name)