import numpy as np import calc_way from scipy import stats import calc_slope_line import matplotlib.pyplot as plt # 车胎横向分界线 k = 0.62849534 b = 21.8122503 """ 读取yolo网络识别路沿的坐标数据,筛选出目标区域的数据点,并将路沿上下侧数据分离 参数:保存数据的txt文件路径 返回值:在目标区域内的下侧数据点坐标x_bot、y_bot,上侧数据点坐标x_top,y_top """ # def get_data(txt_name): # with open(txt_name, 'r', encoding='utf-8') as f: # lines = f.readlines() # data = [] # for i, line in enumerate(lines, 1): # data.append(line.split()) # # print(line.split()) # x_bot = [] # y_bot = [] # x_top = [] # y_top = [] # k_num = 0 # k_num2 = 0 # for i in range(len(data)): # data[i][1] = 960 - int(data[i][1]) # for i in range(len(data)): # if k * int(data[i][0]) + b - int(data[i][1]) < 0: # k_num2 = i # continue # if i > 1: # if (int(data[i][0]) - int(data[i-1][0]))*(int(data[i+2][0]) - int(data[i][0])) < 0: # k_num = i # # print(f"k_num:{k_num},data:") # break # for i in range(len(data)): # if k * int(data[i][0]) + b - int(data[i][1]) < 0: # continue # if i < k_num: # x_bot.append(int(data[i][0])) # y_bot.append(int(data[i][1])) # else: # x_top.append(int(data[i][0])) # y_top.append(int(data[i][1])) # # print(x_bot, y_bot, x_top, y_top) # return x_bot, y_bot, x_top, y_top, k_num2 def get_data(txt_name): with open(txt_name, 'r', encoding='utf-8') as f: lines = f.readlines() data = [] if not data: return None, None, None, None for i, line in enumerate(lines, 1): data.append(line.split()) x = [] y = [] for i in range(len(data)): data[i][1] = 960 - int(data[i][1]) x.append(int(data[i][0])) y.append(int(data[i][1])) x = np.array(x) y = np.array(y) slope, intercept, r_2 = calc_slope_line.linear_regression(x, y) # print(r_2) x_bot = [] y_bot = [] x_top = [] y_top = [] for i in range(len(x)): if x[i] * slope + intercept - y[i] > 0: x_bot.append(x[i]) y_bot.append(y[i]) else: x_top.append(x[i]) y_top.append(y[i]) 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) # print(f"r2_bot = {r2_bot},r2_top = {r2_top}") if ((1-r2_bot) > 1e-2) or ((1-r2_bot) > 1e-2): return None, None, None, None delet = [] for i in range(len(x_bot)): if abs(y_bot[i] - slope_bot * x_bot[i] - intercept_bot) > 10: delet.append(i) # print(f"len(x_bot): {len(x_bot)},delet: {delet})") x_bot = np.delete(x_bot, delet) y_bot = np.delete(y_bot, delet) # y_pred = slope_bot * x_bot + intercept_bot delet = [] for i in range(len(x_top)): if abs(y_top[i] - slope_top * x_top[i] - intercept_top) > 10: delet.append(i) x_top = np.delete(x_top, delet) y_top = np.delete(y_top, delet) # y_pred = slope_top * x_top + intercept_top return x_bot, y_bot, x_top, y_top txt_name = "C:\\Users\\Administrator\\Desktop\\BYD\\20250520\\frame_7800_2.jpg_zuobiao.txt" test_name = r'C:\Users\Administrator\Desktop\BYD\error\20250620\20250620\INPUT_MUST_NOT_BE_EMPTY.txt' def test_get_data(txt_name): with open(txt_name, 'r', encoding='utf-8') as f: lines = f.readlines() data = [] for i, line in enumerate(lines, 1): data.append(line.split()) x = [] y = [] for i in range(len(data)): data[i][1] = 960 - int(data[i][1]) # if k * int(data[i][0]) + b - int(data[i][1]) < 0: # continue x.append(int(data[i][0])) y.append(int(data[i][1])) x = np.array(x) y = np.array(y) slope,intercept,r_2 = calc_slope_line.linear_regression(x, y) fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) axes[0, 0].scatter(x,y, color='blue', label='orgin') # 绘制拟合线 y_pred = slope * x + intercept axes[0, 0].plot(x, y_pred, color='red', label='fix') print(r_2) x_bot = [] y_bot = [] x_top = [] y_top = [] for i in range(len(x)): if x[i] * slope + intercept - y[i] > 0: x_bot.append(x[i]) y_bot.append(y[i]) else: x_top.append(x[i]) y_top.append(y[i]) 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) print(f"r2_bot = {r2_bot},r2_top = {r2_top}") axes[1, 0].scatter(x_bot,y_bot, color='blue', label='orgin') # 绘制拟合线 y_pred = slope_bot * x_bot + intercept_bot axes[1, 0].plot(x_bot, y_pred, color='red', label='fix') axes[1, 1].scatter(x_top,y_top, color='blue', label='orgin') # 绘制拟合线 y_pred = slope_top * x_top + intercept_top axes[1, 1].plot(x_top, y_pred, color='red', label='fix') plt.show() return x_bot, y_bot, x_top, y_top