如何使用Python OpenCV计算阈值图像中指定点位的像素距离


实现思路
- 第一步:直线检测。对输入的阈值图做Canny边缘检测,再通过
HoughLinesP霍夫直线变换提取图中的所有线段,按线段的平均y坐标排序,y值最小的是顶部线段,y值居中的是中间线段。 - 第二步:拟合顶部直线方程。用顶部线段的两个端点拟合得到直线的一般式
Ax + By + C = 0。 - 第三步:计算中间线段中点。提取中间线段的两个端点坐标,取横、纵坐标的平均值得到中点坐标
(x0, y0)。 - 第四步:计算垂直距离。代入点到直线的距离公式
d = |A*x0 + B*y0 + C| / sqrt(A² + B²)得到目标距离,单位为像素;如果需要实际物理距离,可以提前用参照物做像素当量校准。
代码示例
import cv2 import numpy as np # 读取阈值处理后的输入图 img = cv2.imread('uWZCv.png', 0) # 边缘检测 edges = cv2.Canny(img, 50, 150, apertureSize=3) # 霍夫直线检测,参数可根据实际检测效果调整 lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=20, minLineLength=30, maxLineGap=5) # 存储所有线段的平均y坐标和端点信息 line_info = [] for line in lines: x1, y1, x2, y2 = line[0] avg_y = (y1 + y2) / 2 line_info.append((avg_y, x1, y1, x2, y2)) # 按平均y升序排序,排序后第一个为顶部线段,第二个为中间线段 line_info.sort() top_y, top_x1, top_y1, top_x2, top_y2 = line_info[0] mid_y, mid_x1, mid_y1, mid_x2, mid_y2 = line_info[1] # 拟合顶部直线一般式 Ax + By + C = 0 A = top_y2 - top_y1 B = top_x1 - top_x2 C = top_x2 * top_y1 - top_x1 * top_y2 # 计算中间线段的中点坐标 mid_point_x = (mid_x1 + mid_x2) / 2 mid_point_y = (mid_y1 + mid_y2) / 2 # 计算垂直距离(像素单位) distance = abs(A * mid_point_x + B * mid_point_y + C) / np.sqrt(A**2 + B**2) print(f"目标距离d为{distance:.2f}像素")
如果检测结果存在无关线段干扰,可调整HoughLinesP的阈值、最小线长、最大间隙参数过滤无效结果,也可新增线段长度校验逻辑,只保留长度符合预期的两条目标线段即可。
内容的提问来源于stack exchange,提问作者Priya Sadh
相关产品推荐
相关产品推荐

