verical: step - 2
This commit is contained in:
parent
365d59fe75
commit
b80bd056c0
@ -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_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 - ℹ️ 保存原始图像到: 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: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}
|
||||||
|
@ -122,6 +122,8 @@ def _merge_collinear_lines_iterative(lines_from_hough,
|
|||||||
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_from_hough is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -116,10 +116,81 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
|
|||||||
cv2.waitKey(delay)
|
cv2.waitKey(delay)
|
||||||
|
|
||||||
# 筛选近似垂直的线
|
# 筛选近似垂直的线
|
||||||
vertical_lines = []
|
vertical_only_lines = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
x1, y1, x2, y2 = line[0]
|
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:
|
if y1 < height * 0.4 and y2 < height * 0.4:
|
||||||
continue # 忽略上半部分的线
|
continue # 忽略上半部分的线
|
||||||
@ -140,14 +211,6 @@ def detect_dual_track_lines(image, observe=False, delay=1000, save_log=True,
|
|||||||
# 保存线段、其坐标、斜率和长度
|
# 保存线段、其坐标、斜率和长度
|
||||||
vertical_lines.append((line[0], mid_x, mid_y, slope, line_length))
|
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:
|
||||||
if len(vertical_lines) < 2:
|
if len(vertical_lines) < 2:
|
||||||
error("未检测到足够的垂直线", "失败")
|
error("未检测到足够的垂直线", "失败")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user