增强双轨迹线检测功能,优化了线条合并逻辑,更新了调试信息以便于可视化和结果追踪。增加了合并前后线条数量的记录,提升了代码可读性和调试便利性。

This commit is contained in:
Havoc 2025-05-31 13:00:39 +08:00
parent b80bd056c0
commit 3f4e26af75
3 changed files with 123 additions and 20 deletions

View File

@ -484,3 +484,88 @@
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_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 - 保存原始图像到: 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} 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}
2025-05-31 12:50:20 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:50:21 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:50:22 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:50:23 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:50:24 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:50:25 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:50:26 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 12:50:27 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3
2025-05-31 12:50:28 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95
2025-05-31 12:50:29 | INFO | utils.log_helper - 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_125029_866953.jpg
2025-05-31 12:50:29 | INFO | utils.log_helper - 保存原始图像到: logs/image/dual_track_orig_20250531_125029_866953.jpg
2025-05-31 12:50:29 | INFO | utils.log_helper - 双轨迹线检测结果: {'timestamp': '20250531_125029_866953', '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:52:07 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:52:08 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:52:09 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:52:10 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:52:11 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:52:12 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:52:13 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 12:52:14 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3
2025-05-31 12:52:15 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95
2025-05-31 12:52:16 | INFO | utils.log_helper - 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_125216_879014.jpg
2025-05-31 12:52:16 | INFO | utils.log_helper - 保存原始图像到: logs/image/dual_track_orig_20250531_125216_879014.jpg
2025-05-31 12:52:16 | INFO | utils.log_helper - 双轨迹线检测结果: {'timestamp': '20250531_125216_879014', '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:52:58 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:52:58 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3
2025-05-31 12:52:59 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95
2025-05-31 12:52:59 | INFO | utils.log_helper - 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_125259_481164.jpg
2025-05-31 12:52:59 | INFO | utils.log_helper - 保存原始图像到: logs/image/dual_track_orig_20250531_125259_481164.jpg
2025-05-31 12:52:59 | INFO | utils.log_helper - 双轨迹线检测结果: {'timestamp': '20250531_125259_481164', '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:54:35 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:54:35 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:54:36 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:54:37 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:54:38 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:54:39 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:54:40 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 12:54:41 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3
2025-05-31 12:54:42 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95
2025-05-31 12:54:43 | INFO | utils.log_helper - 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_125443_597935.jpg
2025-05-31 12:54:43 | INFO | utils.log_helper - 保存原始图像到: logs/image/dual_track_orig_20250531_125443_597935.jpg
2025-05-31 12:54:43 | INFO | utils.log_helper - 双轨迹线检测结果: {'timestamp': '20250531_125443_597935', '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:57:32 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:57:33 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:57:34 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:57:35 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:57:36 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:57:37 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:58:55 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:58:56 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:58:57 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:58:58 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:58:59 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:59:00 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 12:59:46 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 12:59:47 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 12:59:48 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 12:59:49 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 12:59:50 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 12:59:51 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 13:00:08 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 13:00:10 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 13:00:11 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 13:00:12 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 13:00:13 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 13:00:14 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 13:00:15 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 13:00:19 | DEBUG | utils.log_helper - 🐞 步骤1: 创建黄色掩码
2025-05-31 13:00:20 | DEBUG | utils.log_helper - 🐞 步骤1.5: 底部区域掩码
2025-05-31 13:00:21 | DEBUG | utils.log_helper - 🐞 步骤2: 边缘检测
2025-05-31 13:00:22 | DEBUG | utils.log_helper - 🐞 步骤3: 检测到 54 条直线
2025-05-31 13:00:23 | DEBUG | utils.log_helper - 🐞 步骤3.2: 筛选出 11 条垂直候选线 (合并前)
2025-05-31 13:00:24 | DEBUG | utils.log_helper - 🐞 步骤3.5: 合并筛选出 7 条垂直候选线 (合并后)
2025-05-31 13:00:25 | DEBUG | utils.log_helper - 🐞 步骤4: 找到 7 条垂直线
2025-05-31 13:00:26 | DEBUG | utils.log_helper - 🐞 左侧候选线数量: 4, 右侧候选线数量: 3
2025-05-31 13:00:27 | DEBUG | utils.log_helper - 🐞 选择最佳线对,评分: 0.95
2025-05-31 13:00:28 | INFO | utils.log_helper - 保存双轨迹线检测结果图像到: logs/image/dual_track_20250531_130028_867883.jpg
2025-05-31 13:00:28 | INFO | utils.log_helper - 保存原始图像到: logs/image/dual_track_orig_20250531_130028_867883.jpg
2025-05-31 13:00:28 | INFO | utils.log_helper - 双轨迹线检测结果: {'timestamp': '20250531_130028_867883', '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}

View File

@ -117,21 +117,19 @@ def _merge_two_lines(line1_pts, line2_pts):
return [int(round(p_start[0])), int(round(p_start[1])), return [int(round(p_start[0])), int(round(p_start[1])),
int(round(p_end[0])), int(round(p_end[1]))] int(round(p_end[0])), int(round(p_end[1]))]
def _merge_collinear_lines_iterative(lines_from_hough, def _merge_collinear_lines_iterative(lines,
min_initial_len, min_initial_len,
max_angle_diff_deg, max_angle_diff_deg,
max_ep_gap_abs, max_ep_gap_factor, max_ep_gap_abs, max_ep_gap_factor,
max_p_dist_abs, max_p_dist_factor): max_p_dist_abs, max_p_dist_factor):
""" """
""" """
if lines_from_hough is None: if lines is None:
return None return None
# 将HoughLinesP的输出转换为Python列表 [[x1,y1,x2,y2], ...]
py_lines = [list(line[0]) for line in lines_from_hough]
# 过滤掉初始太短的线 # 过滤掉初始太短的线
current_lines = [line for line in py_lines if np.linalg.norm(np.array(line[:2]) - np.array(line[2:])) >= min_initial_len] current_lines = [line for line in lines if np.linalg.norm(np.array(line[:2]) - np.array(line[2:])) >= min_initial_len]
print(f"合并前: {len(lines)} 条线, 过滤后: {len(current_lines)} 条线")
if not current_lines or len(current_lines) < 2: if not current_lines or len(current_lines) < 2:
return np.array([[line] for line in current_lines]) if current_lines else np.array([]) return np.array([[line] for line in current_lines]) if current_lines else np.array([])

View File

@ -132,7 +132,7 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
# 筛选接近垂直的线 (斜率较大),但允许更多倾斜度 # 筛选接近垂直的线 (斜率较大),但允许更多倾斜度
if max_slope_threshold > abs(slope) > min_slope_threshold: if max_slope_threshold > abs(slope) > min_slope_threshold:
vertical_only_lines.append(line) vertical_only_lines.append(line[0])
if observe: if observe:
debug(f"步骤3.2: 筛选出 {len(vertical_only_lines)} 条垂直候选线 (合并前)", "可视化") debug(f"步骤3.2: 筛选出 {len(vertical_only_lines)} 条垂直候选线 (合并前)", "可视化")
@ -140,7 +140,7 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
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) 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)] 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): for i, line in enumerate(vertical_only_lines):
x1, y1, x2, y2 = line[0] x1, y1, x2, y2 = line
cv2.line(pre_merge_lines_img, (x1, y1), (x2, y2), colors[i % len(colors)], 2) # 使用红色显示合并前的线 cv2.line(pre_merge_lines_img, (x1, y1), (x2, y2), colors[i % len(colors)], 2) # 使用红色显示合并前的线
cv2.imshow("合并前的垂直候选线", pre_merge_lines_img) cv2.imshow("合并前的垂直候选线", pre_merge_lines_img)
cv2.waitKey(delay) cv2.waitKey(delay)
@ -152,17 +152,25 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
# max_ep_gap_factor: 端点间最大相对距离因子 # max_ep_gap_factor: 端点间最大相对距离因子
# max_p_dist_abs: 点到线段最大绝对距离 # max_p_dist_abs: 点到线段最大绝对距离
# max_p_dist_factor: 点到线段最大相对距离因子 # max_p_dist_factor: 点到线段最大相对距离因子
vertical_only_lines_tmp = vertical_only_lines.copy()
vertical_only_lines = _merge_collinear_lines_iterative(vertical_only_lines, vertical_only_lines = _merge_collinear_lines_iterative(vertical_only_lines,
min_initial_len=5.0, min_initial_len=5.0,
max_angle_diff_deg=10.0, max_angle_diff_deg=10.0,
max_ep_gap_abs=max_line_gap / 2.0, max_ep_gap_abs=max_line_gap / 2.0,
max_ep_gap_factor=0.25, max_ep_gap_factor=0.25,
max_p_dist_abs=max_line_gap / 4.0, max_p_dist_abs=max_line_gap / 4.0,
max_p_dist_factor=0.1) max_p_dist_factor=1)
if observe: if observe:
print(f"合并前: {len(lines)} 条线, 合并后: {len(vertical_only_lines)} 条线")
debug(f"步骤3.5: 合并筛选出 {len(vertical_only_lines)} 条垂直候选线 (合并后)", "可视化") 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) # 创建两个图像用于对比显示
pre_merge_img = img.copy()
post_merge_img = img.copy()
# 在两张图上添加标题
cv2.putText(pre_merge_img, "合并前的垂直候选线", (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.putText(post_merge_img, "合并后的垂直候选线", (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
# 为每条线分配不同的颜色 # 为每条线分配不同的颜色
colors = [ colors = [
@ -174,19 +182,31 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
(0, 255, 255), # 黄色 (0, 255, 255), # 黄色
] ]
for i, line in enumerate(vertical_only_lines): # 绘制合并前的线
x1, y1, x2, y2 = line[0] for i, line in enumerate(vertical_only_lines_tmp):
color = colors[i % len(colors)] # 循环使用颜色 x1, y1, x2, y2 = line
cv2.line(vertical_only_lines_img, (x1, y1), (x2, y2), color, 2) color = colors[i % len(colors)]
cv2.line(pre_merge_img, (x1, y1), (x2, y2), color, 2)
# 在线的中点显示序号
mid_x = (x1 + x2) // 2 mid_x = (x1 + x2) // 2
mid_y = (y1 + y2) // 2 mid_y = (y1 + y2) // 2
cv2.putText(vertical_only_lines_img, str(i+1), (mid_x, mid_y), cv2.putText(pre_merge_img, str(i+1), (mid_x, mid_y),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
cv2.imshow("合并后的垂直候选线", vertical_only_lines_img) # 绘制合并后的线
for i, line in enumerate(vertical_only_lines):
x1, y1, x2, y2 = line[0]
color = colors[i % len(colors)]
cv2.line(post_merge_img, (x1, y1), (x2, y2), color, 2)
mid_x = (x1 + x2) // 2
mid_y = (y1 + y2) // 2
cv2.putText(post_merge_img, str(i+1), (mid_x, mid_y),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
# 水平拼接两张图片
combined_img = np.hstack((pre_merge_img, post_merge_img))
cv2.imshow("合并前后的垂直候选线对比", combined_img)
cv2.waitKey(delay) cv2.waitKey(delay)
vertical_lines = [] vertical_lines = []
for line in vertical_only_lines: for line in vertical_only_lines:
x1, y1, x2, y2 = line[0] x1, y1, x2, y2 = line[0]