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

如何使用cv2.goodFeaturesToTrack获取按从下到上、从左到右排序的坐标

问题描述

我正尝试提取图中线条的坐标,但通过cv2.goodFeaturesToTrack获取的坐标未按从左到右或从下到上的顺序排列,请问有解决办法吗?

  • 输入图像:包含多条水平线条的图像
  • 使用goodFeaturesToTrack得到的输出图像:检测出的角点被无序标记的图像
  • 预期结果:角点按从下到上、从左到右顺序标记的图像

在此感谢@Jeru Luke、@Baraa和@stateMachine此前给出的相关解答。

我尝试了以下代码:

x_corners = cv2.goodFeaturesToTrack(h_BeamsCopy, None, 0.01, 10) # None: find all the corners
x_corners = np.int0(x_corners)
for i, hcorner enumerate(x_corners):
    xh, yh = hcorner.ravel()
    cv2.circle(h_BeamsCopy, (xh, yh), 5, (255,100,0), -1)
    cv2.putText(h_BeamsCopy, str(i), (int(xh), int(yh)), font, 0.5, (255, 255, 255), 1)

我期望获取的点能按从下到上、从左到右的顺序排列。


解决办法

cv2.goodFeaturesToTrack返回的角点本身就是无序的,直接对坐标数组做自定义排序就能搞定需求。

修改后的代码:

import cv2
import numpy as np

# 原角点检测逻辑不变
x_corners = cv2.goodFeaturesToTrack(h_BeamsCopy, None, 0.01, 10)
x_corners = np.int0(x_corners)

# 把形状为(N,1,2)的数组转成(N,2),再按规则排序
# 先按y坐标降序(图像里y越大越靠下,降序就是从下到上),再按x坐标升序(从左到右)
sorted_corners = sorted(x_corners.reshape(-1, 2), key=lambda p: (-p[1], p[0]))

# 绘制排序后的点
font = cv2.FONT_HERSHEY_SIMPLEX
for i, (xh, yh) in enumerate(sorted_corners):
    cv2.circle(h_BeamsCopy, (xh, yh), 5, (255,100,0), -1)
    cv2.putText(h_BeamsCopy, str(i), (xh, yh), font, 0.5, (255, 255, 255), 1)

补充说明:

如果你的点存在同一行但y值有微小误差的情况(比如本来是同一水平线,但检测出的y差了几个像素),可以先按y值分组(设置一个阈值,比如y差≤5就算同一行),每组内按x排序,最后把各组按y从大到小合并就行。

内容的提问来源于stack exchange,提问作者user14874585

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:53:13