如何使用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
相关产品推荐
相关产品推荐

