From e08c8b15a987e32556d7f420018e470a1c6f46b2 Mon Sep 17 00:00:00 2001 From: Havoc <2993167370@qq.com> Date: Mon, 19 May 2025 20:52:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=BB=84=E8=89=B2=E8=B5=9B?= =?UTF-8?q?=E9=81=93=E6=A3=80=E6=B5=8B=E6=BC=94=E7=A4=BA=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=9A=84=E8=BE=93=E5=85=A5=E8=B7=AF=E5=BE=84=E4=B8=BA=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=9B=BE=E5=83=8F=EF=BC=8C=E5=B9=B6=E5=9C=A8=E8=BE=B9?= =?UTF-8?q?=E7=BC=98=E6=A3=80=E6=B5=8B=E5=8A=9F=E8=83=BD=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E5=AF=B9=E4=B8=8A=E4=B8=8B=E8=BE=B9=E7=BC=98?= =?UTF-8?q?=E7=BA=BF=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E6=88=AA=E6=96=AD=E7=BA=BF=E7=9A=84?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=9C=BA=E5=88=B6=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E4=BA=86=E6=A3=80=E6=B5=8B=E7=9A=84=E5=87=86=E7=A1=AE=E6=80=A7?= =?UTF-8?q?=E5=92=8C=E7=A8=B3=E5=AE=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/robot_2025-05-19.log | 57 ++++ res/path/test-1.jpg | Bin 0 -> 116663 bytes test/task-path-track/yellow_track_demo.py | 2 +- utils/detect_track.py | 356 ++++++++++++++-------- 4 files changed, 288 insertions(+), 127 deletions(-) create mode 100644 logs/robot_2025-05-19.log create mode 100644 res/path/test-1.jpg diff --git a/logs/robot_2025-05-19.log b/logs/robot_2025-05-19.log new file mode 100644 index 0000000..41c9546 --- /dev/null +++ b/logs/robot_2025-05-19.log @@ -0,0 +1,57 @@ +2025-05-19 20:41:09 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204109_537087.jpg +2025-05-19 20:41:09 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204109_537087', 'edge_point': (397, 816), 'distance_to_center': -563, 'slope': 0.0, 'distance_to_bottom': 264.0, 'intersection_point': (960, 816), 'is_truncated': False} +2025-05-19 20:44:06 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 +2025-05-19 20:44:07 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 +2025-05-19 20:44:08 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 +2025-05-19 20:44:09 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 +2025-05-19 20:44:10 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 +2025-05-19 20:44:11 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 15 条直线 +2025-05-19 20:44:12 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 13 条水平线 +2025-05-19 20:44:13 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (397, 816) +2025-05-19 20:44:14 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 +2025-05-19 20:44:15 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204415_945888.jpg +2025-05-19 20:44:15 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204415_945888', 'edge_point': (397, 816), 'distance_to_center': -563, 'slope': 0.0, 'distance_to_bottom': 264.0, 'intersection_point': (960, 816), 'is_truncated': False} +2025-05-19 20:44:57 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 +2025-05-19 20:44:58 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 +2025-05-19 20:44:59 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 +2025-05-19 20:45:00 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 +2025-05-19 20:45:01 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 +2025-05-19 20:45:02 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 10 条直线 +2025-05-19 20:45:03 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 8 条水平线 +2025-05-19 20:45:04 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (831, 971) +2025-05-19 20:45:05 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 +2025-05-19 20:45:06 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204506_674753.jpg +2025-05-19 20:45:06 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204506_674753', 'edge_point': (831, 971), 'distance_to_center': -129, 'slope': -0.07004830917874397, 'distance_to_bottom': 118.036231884058, 'intersection_point': (960, 961), 'is_truncated': False} +2025-05-19 20:45:37 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 +2025-05-19 20:45:39 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 +2025-05-19 20:45:40 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 +2025-05-19 20:45:41 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 +2025-05-19 20:45:42 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 +2025-05-19 20:45:43 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 17 条直线 +2025-05-19 20:45:44 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 12 条水平线 +2025-05-19 20:45:45 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (923, 849) +2025-05-19 20:45:46 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 +2025-05-19 20:45:47 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204547_188654.jpg +2025-05-19 20:45:47 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204547_188654', 'edge_point': (923, 849), 'distance_to_center': -37, 'slope': 0.0, 'distance_to_bottom': 231.0, 'intersection_point': (960, 849), 'is_truncated': False} +2025-05-19 20:47:53 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 +2025-05-19 20:47:55 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 +2025-05-19 20:47:56 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 +2025-05-19 20:47:57 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 +2025-05-19 20:47:58 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 +2025-05-19 20:47:59 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 17 条直线 +2025-05-19 20:48:00 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 12 条水平线 +2025-05-19 20:48:01 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (923, 849) +2025-05-19 20:48:02 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 +2025-05-19 20:48:03 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_204803_276122.jpg +2025-05-19 20:48:03 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_204803_276122', 'edge_point': (923, 849), 'distance_to_center': -37, 'slope': 0.0, 'distance_to_bottom': 231.0, 'intersection_point': (960, 849), 'is_truncated': False} +2025-05-19 20:50:32 | DEBUG | utils.log_helper - 🐞 步骤1: 原始图像已加载 +2025-05-19 20:50:33 | DEBUG | utils.log_helper - 🐞 步骤2: 创建黄色掩码 +2025-05-19 20:50:34 | DEBUG | utils.log_helper - 🐞 步骤3: 提取黄色部分 +2025-05-19 20:50:35 | DEBUG | utils.log_helper - 🐞 检测底部和顶部边缘点 +2025-05-19 20:50:36 | DEBUG | utils.log_helper - 🐞 步骤4: 边缘检测 +2025-05-19 20:50:37 | DEBUG | utils.log_helper - 🐞 步骤5: 检测到 25 条直线 +2025-05-19 20:50:38 | DEBUG | utils.log_helper - 🐞 步骤6: 找到 18 条水平线 +2025-05-19 20:50:39 | DEBUG | utils.log_helper - 👁️ 步骤7: 找到边缘点 (92, 1077) +2025-05-19 20:50:40 | DEBUG | utils.log_helper - 🐞 显示边缘斜率和中线交点 +2025-05-19 20:50:41 | INFO | utils.log_helper - ℹ️ 保存横向边缘检测结果图像到: logs/image/horizontal_edge_20250519_205041_583040.jpg +2025-05-19 20:50:41 | INFO | utils.log_helper - ℹ️ 横向边缘检测结果: {'timestamp': '20250519_205041_583040', 'edge_point': (92, 1077), 'distance_to_center': -868, 'slope': -0.07008086253369272, 'distance_to_bottom': 63.83018867924534, 'intersection_point': (960, 1016), 'is_truncated': False} diff --git a/res/path/test-1.jpg b/res/path/test-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..706ce2992d8dbe977f3816d6fb91eb0147ba875c GIT binary patch literal 116663 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 literal 0 HcmV?d00001 diff --git a/test/task-path-track/yellow_track_demo.py b/test/task-path-track/yellow_track_demo.py index fd99705..278cfc0 100644 --- a/test/task-path-track/yellow_track_demo.py +++ b/test/task-path-track/yellow_track_demo.py @@ -44,7 +44,7 @@ def process_image(image_path, save_dir=None, show_steps=False): def main(): parser = argparse.ArgumentParser(description='黄色赛道检测演示程序') - parser.add_argument('--input', type=str, default='res/path/image_20250514_024313.png', help='输入图像或视频的路径') + parser.add_argument('--input', type=str, default='res/path/test-1.jpg', help='输入图像或视频的路径') parser.add_argument('--output', type=str, default='res/path/test/result_image_20250514_024313.png', help='输出结果的保存路径') parser.add_argument('--type', type=str, choices=['image', 'video'], help='输入类型,不指定会自动检测') parser.add_argument('--show', default=True, action='store_true', help='显示处理步骤') diff --git a/utils/detect_track.py b/utils/detect_track.py index 360bb6b..2a0386d 100644 --- a/utils/detect_track.py +++ b/utils/detect_track.py @@ -8,6 +8,7 @@ from utils.log_helper import get_logger, debug, info, warning, error, success def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True): """ 检测正前方横向黄色赛道的边缘,并返回y值最大的边缘点 + 优先检测下方横线,但在遇到下方线截断的情况时会考虑上边缘 参数: image: 输入图像,可以是文件路径或者已加载的图像数组 @@ -18,7 +19,7 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True edge_point: 赛道前方边缘点的坐标 (x, y) edge_info: 边缘信息字典 """ - observe = False # TSET + # observe = False # TSET # 如果输入是字符串(文件路径),则加载图像 if isinstance(image, str): img = cv2.imread(image) @@ -91,142 +92,240 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True bottom_row = np.max(col_points) bottom_points.append((left_bound + col, top_bound + bottom_row)) - if len(bottom_points) < 3: - # 如果找不到足够的底部点,使用canny+霍夫变换 - edges = cv2.Canny(mask, 50, 150, apertureSize=3) - + # 寻找每列的最顶部点(上边缘点) + top_points = [] + for col in non_zero_cols: + col_points = np.where(search_mask[:, col] > 0)[0] + if len(col_points) > 0: + top_row = np.min(col_points) + top_points.append((left_bound + col, top_bound + top_row)) + + if observe: + debug("检测底部和顶部边缘点", "处理") + edge_points_img = img.copy() + for point in bottom_points: + cv2.circle(edge_points_img, point, 3, (0, 255, 0), -1) + for point in top_points: + cv2.circle(edge_points_img, point, 3, (255, 0, 255), -1) + cv2.imshow("边缘点", edge_points_img) + cv2.waitKey(delay) + + # 边缘检测 + edges = cv2.Canny(mask, 50, 150, apertureSize=3) + + if observe: + debug("步骤4: 边缘检测", "处理") + cv2.imshow("边缘检测", edges) + cv2.waitKey(delay) + + # 使用霍夫变换检测直线 + lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=30, + minLineLength=width*0.1, maxLineGap=30) + + if lines is None or len(lines) == 0: if observe: - debug("步骤3.1: 边缘检测", "处理") - cv2.imshow("边缘检测", edges) - cv2.waitKey(delay) - - # 使用霍夫变换检测直线 - 调低阈值以检测短线段 - lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=30, - minLineLength=width*0.1, maxLineGap=30) - - if lines is None or len(lines) == 0: - if observe: - error("未检测到直线", "失败") - return None, None - - if observe: - debug(f"步骤4: 检测到 {len(lines)} 条直线", "处理") - lines_img = img.copy() - for line in lines: - x1, y1, x2, y2 = line[0] - cv2.line(lines_img, (x1, y1), (x2, y2), (0, 255, 0), 2) - cv2.imshow("检测到的直线", lines_img) - cv2.waitKey(delay) - - # 筛选水平线,但放宽斜率条件 - horizontal_lines = [] + error("未检测到直线", "失败") + return None, None + + if observe: + debug(f"步骤5: 检测到 {len(lines)} 条直线", "处理") + lines_img = img.copy() for line in lines: x1, y1, x2, y2 = line[0] - - # 计算斜率 (避免除零错误) - if abs(x2 - x1) < 5: # 几乎垂直的线 - continue - - slope = (y2 - y1) / (x2 - x1) - - # 筛选接近水平的线 (斜率接近0),但容许更大的倾斜度 - if abs(slope) < 0.3: - # 确保线在搜索区域内 - if ((left_bound <= x1 <= right_bound and top_bound <= y1 <= bottom_bound) or - (left_bound <= x2 <= right_bound and top_bound <= y2 <= bottom_bound)): - # 计算线的中点y坐标 - mid_y = (y1 + y2) / 2 - line_length = np.sqrt((x2-x1)**2 + (y2-y1)**2) - # 保存线段、其y坐标和长度 - horizontal_lines.append((line[0], mid_y, slope, line_length)) + cv2.line(lines_img, (x1, y1), (x2, y2), (0, 255, 0), 2) + cv2.imshow("检测到的直线", lines_img) + cv2.waitKey(delay) + + # 筛选水平线,但放宽斜率条件 + horizontal_lines = [] + for line in lines: + x1, y1, x2, y2 = line[0] - if not horizontal_lines: - if observe: - error("未检测到水平线", "失败") - return None, None + # 计算斜率 (避免除零错误) + if abs(x2 - x1) < 5: # 几乎垂直的线 + continue + + slope = (y2 - y1) / (x2 - x1) + # 筛选接近水平的线 (斜率接近0),但容许更大的倾斜度 + if abs(slope) < 0.3: + # 确保线在搜索区域内 + if ((left_bound <= x1 <= right_bound and top_bound <= y1 <= bottom_bound) or + (left_bound <= x2 <= right_bound and top_bound <= y2 <= bottom_bound)): + # 计算线的中点y坐标 + mid_y = (y1 + y2) / 2 + line_length = np.sqrt((x2-x1)**2 + (y2-y1)**2) + # 保存线段、其y坐标和长度 + horizontal_lines.append((line[0], mid_y, slope, line_length)) + + if not horizontal_lines: if observe: - debug(f"步骤4.1: 找到 {len(horizontal_lines)} 条水平线", "处理") - h_lines_img = img.copy() - for line_info in horizontal_lines: - line, _, slope, _ = line_info - x1, y1, x2, y2 = line - cv2.line(h_lines_img, (x1, y1), (x2, y2), (0, 255, 255), 2) - # 显示斜率 - cv2.putText(h_lines_img, f"{slope:.2f}", ((x1+x2)//2, (y1+y2)//2), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1) - cv2.imshow("水平线", h_lines_img) - cv2.waitKey(delay) - + error("未检测到水平线", "失败") + return None, None + + if observe: + debug(f"步骤6: 找到 {len(horizontal_lines)} 条水平线", "处理") + h_lines_img = img.copy() + for line_info in horizontal_lines: + line, _, slope, _ = line_info + x1, y1, x2, y2 = line + cv2.line(h_lines_img, (x1, y1), (x2, y2), (0, 255, 255), 2) + # 显示斜率 + cv2.putText(h_lines_img, f"{slope:.2f}", ((x1+x2)//2, (y1+y2)//2), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1) + cv2.imshow("水平线", h_lines_img) + cv2.waitKey(delay) + + # 将水平线分为上边缘线和下边缘线(按y坐标排序) + bottom_line = None + top_line = None + is_truncated = False # 标记下方线是否被截断 + + if len(horizontal_lines) > 1: # 按y坐标排序 (从大到小,底部的线排在前面) horizontal_lines.sort(key=lambda x: x[1], reverse=True) - # 取最靠近底部且足够长的线作为横向赛道线 - selected_line = None - selected_slope = 0 - for line_info in horizontal_lines: - line, _, slope, length = line_info - if length > width * 0.1: # 确保线足够长 - selected_line = line - selected_slope = slope - break + # 提取最底部和次底部的线段 + bottom_line = horizontal_lines[0] - if selected_line is None and horizontal_lines: - # 如果没有足够长的线,就取最靠近底部的线 - selected_line = horizontal_lines[0][0] - selected_slope = horizontal_lines[0][2] + # 检查是否有明显的上下边缘 + y_coords = [line[1] for line in horizontal_lines] + y_diffs = [y_coords[i] - y_coords[i+1] for i in range(len(y_coords)-1)] - if selected_line is None: - if observe: - error("无法选择合适的线段", "失败") - return None, None + if len(y_diffs) > 0 and max(y_diffs) > height * 0.05: # 如果有明显的高度差 + # 找到高度差最大的位置 + split_idx = y_diffs.index(max(y_diffs)) - x1, y1, x2, y2 = selected_line + # 分别获取下边缘线和上边缘线 + bottom_line = horizontal_lines[0] # 最底部的线 + top_line = horizontal_lines[split_idx+1] # 上边缘线 + + # 检查上下两条线是否平行 - 计算斜率差异 + bottom_slope = bottom_line[2] + top_slope = top_line[2] + slope_diff = abs(bottom_slope - top_slope) + + # 计算两线的交点(如果存在) + bottom_x1, bottom_y1, bottom_x2, bottom_y2 = bottom_line[0] + top_x1, top_y1, top_x2, top_y2 = top_line[0] + + # 根据斜率差异判断是否平行 + # 如果斜率差异很小,认为基本平行 + if slope_diff > 0.05: # 斜率差异超过阈值 + # 计算两条线延长后的交点 + # 线段方程: y = mx + b + # 计算两条线的截距b + bottom_b = bottom_y1 - bottom_slope * bottom_x1 + top_b = top_y1 - top_slope * top_x1 + + # 检查交点是否在图像范围内或者附近 + # 求解 y = m1*x + b1 = m2*x + b2 + if abs(bottom_slope - top_slope) > 1e-6: # 避免除以接近0的值 + intersection_x = (top_b - bottom_b) / (bottom_slope - top_slope) + intersection_y = bottom_slope * intersection_x + bottom_b + + # 判断交点是否在图像宽度的2倍范围内 + if -width <= intersection_x <= width * 2: + is_truncated = True + if observe: + debug(f"检测到上下边缘线不平行,交点: ({intersection_x:.1f}, {intersection_y:.1f})", "分析") + debug("判断下方线被截断", "分析") + + # 显示上下边缘线及其延长线和交点 + intersect_img = img.copy() + # 画原始线段 + cv2.line(intersect_img, (bottom_x1, bottom_y1), (bottom_x2, bottom_y2), (0, 255, 0), 2) + cv2.line(intersect_img, (top_x1, top_y1), (top_x2, top_y2), (255, 0, 255), 2) + + # 延长线段以显示交点 + ext_left_x = max(0, int(intersection_x - width/2)) + ext_right_x = min(width-1, int(intersection_x + width/2)) + + # 计算延长线上的点 + bottom_ext_left_y = int(bottom_slope * ext_left_x + bottom_b) + bottom_ext_right_y = int(bottom_slope * ext_right_x + bottom_b) + top_ext_left_y = int(top_slope * ext_left_x + top_b) + top_ext_right_y = int(top_slope * ext_right_x + top_b) + + # 绘制延长线 + cv2.line(intersect_img, (ext_left_x, bottom_ext_left_y), + (ext_right_x, bottom_ext_right_y), (0, 255, 0), 1, cv2.LINE_DASHED) + cv2.line(intersect_img, (ext_left_x, top_ext_left_y), + (ext_right_x, top_ext_right_y), (255, 0, 255), 1, cv2.LINE_DASHED) + + # 标记交点 + if 0 <= intersection_x < width and 0 <= intersection_y < height: + cv2.circle(intersect_img, (int(intersection_x), int(intersection_y)), + 10, (0, 0, 255), -1) + + cv2.imshow("上下边缘线交点分析", intersect_img) + cv2.waitKey(delay) + + # 如果检测到下方线被截断,使用上边缘线来估计实际的下边缘线 + if is_truncated and top_line is not None: + if observe: + debug("使用上边缘估计真实的下边缘", "处理") + + # 获取赛道平均宽度(可以是预先测量的固定值,或根据未截断部分测量) + # 这里假设赛道宽度是固定的,可以根据实际情况调整 + track_width_pixels = height * 0.15 # 假设赛道宽度是图像高度的15% + + # 计算一个修正后的底部线段,方向与上边缘线平行,但位置下移 + corrected_bottom_slope = top_slope # 使用上边缘的斜率 + + # 计算上边缘线的方程: y = mx + b + top_b = top_y1 - top_slope * top_x1 + + # 计算修正后的下边缘线的截距,使其下移track_width_pixels距离 + # 由于是在图像坐标系,y轴向下,所以是加法 + corrected_bottom_b = top_b + track_width_pixels + + # 计算修正后的下边缘线的两个端点 + corrected_bottom_x1 = left_bound + corrected_bottom_y1 = int(corrected_bottom_slope * corrected_bottom_x1 + corrected_bottom_b) + corrected_bottom_x2 = right_bound + corrected_bottom_y2 = int(corrected_bottom_slope * corrected_bottom_x2 + corrected_bottom_b) + + # 创建修正后的底部线段 + corrected_bottom_line = ( + [corrected_bottom_x1, corrected_bottom_y1, corrected_bottom_x2, corrected_bottom_y2], + (corrected_bottom_y1 + corrected_bottom_y2) / 2, # mid_y + corrected_bottom_slope, + np.sqrt((corrected_bottom_x2-corrected_bottom_x1)**2 + (corrected_bottom_y2-corrected_bottom_y1)**2) # length + ) + + if observe: + # 显示修正后的线段 + corrected_img = img.copy() + # 原始线段 + cv2.line(corrected_img, (bottom_x1, bottom_y1), (bottom_x2, bottom_y2), (0, 255, 0), 2) + cv2.line(corrected_img, (top_x1, top_y1), (top_x2, top_y2), (255, 0, 255), 2) + # 修正后的线段 + cv2.line(corrected_img, (corrected_bottom_x1, corrected_bottom_y1), + (corrected_bottom_x2, corrected_bottom_y2), (0, 0, 255), 2) + + cv2.putText(corrected_img, "截断的底边", (bottom_x1, bottom_y1 - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) + cv2.putText(corrected_img, "上边缘", (top_x1, top_y1 - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2) + cv2.putText(corrected_img, "修正后的底边", (corrected_bottom_x1, corrected_bottom_y1 - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) + + cv2.imshow("修正后的边缘线", corrected_img) + cv2.waitKey(delay) + + # 使用修正后的底部线作为选定的线 + bottom_line = corrected_bottom_line else: - # 使用底部点拟合直线 - if observe: - debug("正在处理底部边缘点", "处理") - bottom_points_img = img.copy() - for point in bottom_points: - cv2.circle(bottom_points_img, point, 3, (0, 255, 0), -1) - cv2.imshow("底部边缘点", bottom_points_img) - cv2.waitKey(delay) - - # 使用RANSAC拟合直线以去除异常值 - x_points = np.array([p[0] for p in bottom_points]).reshape(-1, 1) - y_points = np.array([p[1] for p in bottom_points]) - - # 如果点过少或分布不够宽,返回None - if len(bottom_points) < 3 or np.max(x_points) - np.min(x_points) < width * 0.1: - if observe: - warning("底部点太少或分布不够宽", "警告") - return None, None - - ransac = linear_model.RANSACRegressor(residual_threshold=5.0) - ransac.fit(x_points, y_points) - - # 获取拟合参数 - selected_slope = ransac.estimator_.coef_[0] - intercept = ransac.estimator_.intercept_ - - # 检查斜率是否在合理范围内 - if abs(selected_slope) > 0.3: - if observe: - warning(f"拟合斜率过大: {selected_slope:.4f}", "警告") - return None, None - - # 使用拟合的直线参数计算线段端点 - x1 = left_bound - y1 = int(selected_slope * x1 + intercept) - x2 = right_bound - y2 = int(selected_slope * x2 + intercept) - - if observe: - debug("显示拟合线段", "处理") - fitted_line_img = img.copy() - cv2.line(fitted_line_img, (x1, y1), (x2, y2), (0, 255, 255), 2) - cv2.imshow("拟合线段", fitted_line_img) - cv2.waitKey(delay) + # 只有一条水平线 + bottom_line = horizontal_lines[0] + + # 使用底部线段作为最终选择 + selected_line = bottom_line[0] + selected_slope = bottom_line[2] + + # 提取线段端点 + x1, y1, x2, y2 = selected_line # 确保x1 < x2 if x1 > x2: @@ -248,7 +347,7 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True selected_points.append((x, y)) if observe: - debug(f"步骤5: 找到边缘点 {bottom_edge_point}", "检测") + debug(f"步骤7: 找到边缘点 {bottom_edge_point}", "检测") edge_img = img.copy() # 画线 cv2.line(edge_img, (x1, y1), (x2, y2), (0, 255, 0), 2) @@ -297,6 +396,9 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.putText(slope_img, f"中线交点: ({intersection_point[0]}, {intersection_point[1]})", (10, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) + if is_truncated: + cv2.putText(slope_img, "下方线被截断(已修正)", (10, 190), + cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) if observe: debug("显示边缘斜率和中线交点", "显示") @@ -321,7 +423,8 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True "distance_to_center": distance_to_center, "slope": selected_slope, "distance_to_bottom": distance_to_bottom, - "intersection_point": intersection_point + "intersection_point": intersection_point, + "is_truncated": is_truncated } info(f"横向边缘检测结果: {log_info}", "日志") @@ -335,6 +438,7 @@ def detect_horizontal_track_edge(image, observe=False, delay=1000, save_log=True "points_count": len(selected_points), # 该组中点的数量 "intersection_point": intersection_point, # 中线与横向线的交点 "distance_to_bottom": distance_to_bottom, # 交点到图像底部的距离 + "is_truncated": is_truncated, # 下方线是否被截断并修正 # "points": selected_points # 添加选定的点组 }