From b80bd056c0a5811172c56d9dafd6749cba0b4d2e Mon Sep 17 00:00:00 2001 From: Havoc <2993167370@qq.com> Date: Sat, 31 May 2025 12:49:01 +0800 Subject: [PATCH] =?UTF-8?q?verical=EF=BC=9A=20step=20-=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/robot_2025-05-31.log | 69 +++++++++++++++++++++++++++ utils/base_line_handler.py | 2 + utils/detect_dual_track_lines.py | 81 ++++++++++++++++++++++++++++---- 3 files changed, 143 insertions(+), 9 deletions(-) diff --git a/logs/robot_2025-05-31.log b/logs/robot_2025-05-31.log index de42d62..7af30ae 100644 --- a/logs/robot_2025-05-31.log +++ b/logs/robot_2025-05-31.log @@ -415,3 +415,72 @@ 2025-05-31 12:33:14 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_123314_086361.jpg 2025-05-31 12:33:14 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_123314_086361.jpg 2025-05-31 12:33:14 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_123314_086361', 'center_point': (944, 1080), 'deviation': -1.1368683772161603e-13, 'left_track_mid_x': 565.0, 'right_track_mid_x': 1335.5, 'track_width': 770.5, 'center_slope': 0.01738261738261669} +2025-05-31 12:36:59 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:37:00 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:37:01 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:37:02 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:39:23 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:39:24 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:39:25 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:39:26 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:40:04 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:40:05 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:40:06 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:40:07 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:40:08 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线 +2025-05-31 12:40:09 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3 +2025-05-31 12:40:10 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95 +2025-05-31 12:40:11 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_124011_316891.jpg +2025-05-31 12:40:11 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_124011_316891.jpg +2025-05-31 12:40:11 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_124011_316891', 'center_point': (945, 1080), 'deviation': 3.410605131648481e-13, 'left_track_mid_x': 608.5, 'right_track_mid_x': 1219.0, 'track_width': 610.5, 'center_slope': 0.02351973684210257} +2025-05-31 12:41:08 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:41:09 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:41:10 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:41:11 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:41:12 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并前筛选出 7 条垂直候选线 +2025-05-31 12:41:13 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线 +2025-05-31 12:41:14 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3 +2025-05-31 12:41:15 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95 +2025-05-31 12:41:16 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_124116_518961.jpg +2025-05-31 12:41:16 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_124116_518961.jpg +2025-05-31 12:41:16 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_124116_518961', 'center_point': (945, 1080), 'deviation': 3.410605131648481e-13, 'left_track_mid_x': 608.5, 'right_track_mid_x': 1219.0, 'track_width': 610.5, 'center_slope': 0.02351973684210257} +2025-05-31 12:41:33 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:41:34 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:41:35 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:41:36 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:41:37 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并前筛选出 7 条垂直候选线 +2025-05-31 12:41:38 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线 +2025-05-31 12:41:39 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3 +2025-05-31 12:41:40 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95 +2025-05-31 12:41:41 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_124141_532246.jpg +2025-05-31 12:41:41 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_124141_532246.jpg +2025-05-31 12:41:41 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_124141_532246', 'center_point': (945, 1080), 'deviation': 3.410605131648481e-13, 'left_track_mid_x': 608.5, 'right_track_mid_x': 1219.0, 'track_width': 610.5, 'center_slope': 0.02351973684210257} +2025-05-31 12:46:48 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:46:49 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:46:50 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:46:51 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:46:52 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前) +2025-05-31 12:47:19 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:47:20 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:47:21 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:47:22 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:47:23 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前) +2025-05-31 12:47:24 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后) +2025-05-31 12:47:25 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线 +2025-05-31 12:47:26 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3 +2025-05-31 12:47:27 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95 +2025-05-31 12:47:28 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_124728_888798.jpg +2025-05-31 12:47:28 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_124728_888798.jpg +2025-05-31 12:47:28 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_124728_888798', 'center_point': (945, 1080), 'deviation': 3.410605131648481e-13, 'left_track_mid_x': 608.5, 'right_track_mid_x': 1219.0, 'track_width': 610.5, 'center_slope': 0.02351973684210257} +2025-05-31 12:47:31 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码 +2025-05-31 12:47:32 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码 +2025-05-31 12:47:33 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测 +2025-05-31 12:47:34 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线 +2025-05-31 12:47:35 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前) +2025-05-31 12:47:36 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后) +2025-05-31 12:47:37 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线 +2025-05-31 12:47:38 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3 +2025-05-31 12:47:39 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95 +2025-05-31 12:47:40 | INFO | utils.log_helper - ℹ️ 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_124740_814452.jpg +2025-05-31 12:47:40 | INFO | utils.log_helper - ℹ️ 保存原始图像到: logs/image/dual_track_orig_20250531_124740_814452.jpg +2025-05-31 12:47:40 | INFO | utils.log_helper - ℹ️ 双轨迹线检测结果: {'timestamp': '20250531_124740_814452', 'center_point': (945, 1080), 'deviation': 3.410605131648481e-13, 'left_track_mid_x': 608.5, 'right_track_mid_x': 1219.0, 'track_width': 610.5, 'center_slope': 0.02351973684210257} diff --git a/utils/base_line_handler.py b/utils/base_line_handler.py index f9af663..a02cf78 100644 --- a/utils/base_line_handler.py +++ b/utils/base_line_handler.py @@ -122,6 +122,8 @@ def _merge_collinear_lines_iterative(lines_from_hough, max_angle_diff_deg, max_ep_gap_abs, max_ep_gap_factor, max_p_dist_abs, max_p_dist_factor): + """ + """ if lines_from_hough is None: return None diff --git a/utils/detect_dual_track_lines.py b/utils/detect_dual_track_lines.py index 953ac62..511cf00 100644 --- a/utils/detect_dual_track_lines.py +++ b/utils/detect_dual_track_lines.py @@ -116,10 +116,81 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True, cv2.waitKey(delay) # 筛选近似垂直的线 - vertical_lines = [] + vertical_only_lines = [] for line in lines: x1, y1, x2, y2 = line[0] + # 优先选择图像底部的线 + if y1 < height * 0.4 and y2 < height * 0.4: + continue # 忽略上半部分的线 + + # 计算斜率 (避免除零错误) + if abs(x2 - x1) < 5: # 几乎垂直的线 + slope = 100 # 设置一个较大的值表示接近垂直 + else: + slope = (y2 - y1) / (x2 - x1) + + # 筛选接近垂直的线 (斜率较大),但允许更多倾斜度 + if max_slope_threshold > abs(slope) > min_slope_threshold: + vertical_only_lines.append(line) + + if observe: + debug(f"步骤3.2: 筛选出 {len(vertical_only_lines)} 条垂直候选线 (合并前)", "可视化") + pre_merge_lines_img = img.copy() + cv2.putText(pre_merge_lines_img, "Step 3.2: Vertical Candidates (Pre-Merge)", (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) + colors = [(0, 0, 255), (0, 255, 0), (0, 255, 255), (255, 0, 0), (255, 0, 255), (255, 255, 0)] + for i, line in enumerate(vertical_only_lines): + x1, y1, x2, y2 = line[0] + cv2.line(pre_merge_lines_img, (x1, y1), (x2, y2), colors[i % len(colors)], 2) # 使用红色显示合并前的线 + cv2.imshow("合并前的垂直候选线", pre_merge_lines_img) + cv2.waitKey(delay) + + # 合并共线线段,参数说明: + # min_initial_len: 最小初始线段长度 + # max_angle_diff_deg: 最大允许角度差(度) + # max_ep_gap_abs: 端点间最大绝对距离 + # max_ep_gap_factor: 端点间最大相对距离因子 + # max_p_dist_abs: 点到线段最大绝对距离 + # max_p_dist_factor: 点到线段最大相对距离因子 + vertical_only_lines = _merge_collinear_lines_iterative(vertical_only_lines, + min_initial_len=5.0, + max_angle_diff_deg=10.0, + max_ep_gap_abs=max_line_gap / 2.0, + max_ep_gap_factor=0.25, + max_p_dist_abs=max_line_gap / 4.0, + max_p_dist_factor=0.1) + if observe: + debug(f"步骤3.5: 合并筛选出 {len(vertical_only_lines)} 条垂直候选线 (合并后)", "可视化") + vertical_only_lines_img = img.copy() + cv2.putText(vertical_only_lines_img, "Step 3.5: Vertical Candidates (Post-Merge)", (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) + + # 为每条线分配不同的颜色 + colors = [ + (255, 0, 0), # 蓝色 + (0, 255, 0), # 绿色 + (0, 0, 255), # 红色 + (255, 255, 0), # 青色 + (255, 0, 255), # 品红 + (0, 255, 255), # 黄色 + ] + + for i, line in enumerate(vertical_only_lines): + x1, y1, x2, y2 = line[0] + color = colors[i % len(colors)] # 循环使用颜色 + cv2.line(vertical_only_lines_img, (x1, y1), (x2, y2), color, 2) + + # 在线的中点显示序号 + mid_x = (x1 + x2) // 2 + mid_y = (y1 + y2) // 2 + cv2.putText(vertical_only_lines_img, str(i+1), (mid_x, mid_y), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) + + cv2.imshow("合并后的垂直候选线", vertical_only_lines_img) + cv2.waitKey(delay) + vertical_lines = [] + for line in vertical_only_lines: + x1, y1, x2, y2 = line[0] + # 优先选择图像底部的线 if y1 < height * 0.4 and y2 < height * 0.4: continue # 忽略上半部分的线 @@ -139,14 +210,6 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True, mid_y = (y1 + y2) / 2 # 保存线段、其坐标、斜率和长度 vertical_lines.append((line[0], mid_x, mid_y, slope, line_length)) - - # vertical_lines = _merge_collinear_lines_iterative(vertical_lines, - # min_initial_len=5.0, - # max_angle_diff_deg=10.0, - # max_ep_gap_abs=max_line_gap / 2.0, - # max_ep_gap_factor=0.25, - # max_p_dist_abs=max_line_gap / 4.0, - # max_p_dist_factor=0.1) if len(vertical_lines) < 2: if len(vertical_lines) < 2: