You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 04:12:04