增强双轨迹线检测功能,优化了线条合并逻辑,更新了调试信息以便于可视化和结果追踪。增加了合并前后线条数量的记录,提升了代码可读性和调试便利性。
This commit is contained in:
parent
b80bd056c0
commit
3f4e26af75
@ -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_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: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}
|
||||
|
@ -117,21 +117,19 @@ def _merge_two_lines(line1_pts, line2_pts):
|
||||
return [int(round(p_start[0])), int(round(p_start[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,
|
||||
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:
|
||||
if lines is 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:
|
||||
return np.array([[line] for line in current_lines]) if current_lines else np.array([])
|
||||
|
@ -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:
|
||||
vertical_only_lines.append(line)
|
||||
vertical_only_lines.append(line[0])
|
||||
|
||||
if observe:
|
||||
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)
|
||||
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]
|
||||
x1, y1, x2, y2 = line
|
||||
cv2.line(pre_merge_lines_img, (x1, y1), (x2, y2), colors[i % len(colors)], 2) # 使用红色显示合并前的线
|
||||
cv2.imshow("合并前的垂直候选线", pre_merge_lines_img)
|
||||
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_p_dist_abs: 点到线段最大绝对距离
|
||||
# max_p_dist_factor: 点到线段最大相对距离因子
|
||||
vertical_only_lines_tmp = vertical_only_lines.copy()
|
||||
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)
|
||||
max_p_dist_factor=1)
|
||||
if observe:
|
||||
print(f"合并前: {len(lines)} 条线, 合并后: {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 = [
|
||||
@ -174,19 +182,31 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
|
||||
(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)
|
||||
|
||||
# 在线的中点显示序号
|
||||
# 绘制合并前的线
|
||||
for i, line in enumerate(vertical_only_lines_tmp):
|
||||
x1, y1, x2, y2 = line
|
||||
color = colors[i % len(colors)]
|
||||
cv2.line(pre_merge_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.putText(pre_merge_img, str(i+1), (mid_x, mid_y),
|
||||
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)
|
||||
|
||||
vertical_lines = []
|
||||
for line in vertical_only_lines:
|
||||
x1, y1, x2, y2 = line[0]
|
||||
|
Loading…
x
Reference in New Issue
Block a user