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_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}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user