我试图找到这些三角形角落的像素值。我可以使用哈里斯角,并获得角落所有x,y的numpy数组。我希望这些角点值存储在名为[[x1,y1], [x2,y2], [x3,y3]]
的角落的2D列表中。
另外,当我在黑色三角形(下面张贴的代码),白色背景上使用哈里斯角时,结果就是(array([121, 121, 122, 122, 123, 123, 124, 124, 359, 359, 359, 359, 359, 359, 360, 360, 360, 360], dtype=int64), array([240, 241, 240, 241, 240, 241, 240, 241, 121, 122, 123, 358, 359,360, 121, 122, 359, 360], dtype=int64))
。我需要从这个列表中创建3个角的2D列表。
img = cv2.imread(filePath)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = numpy.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
x,y = numpy.nonzero(dst > 0.01 * dst.max())
答案 0 :(得分:1)
使用当前最简单的操作值是应用 k -means,这会将数据聚类到 k 组中,并为您提供这些组的中心组。您可以查看OpenCV k -means Python教程here,还可以查看cv2.kmeans()
docs。
首先从表格中的点开始:
>>> X = np.array([121, 121, 122, 122, 123, 123, 124, 124, 359, 359, 359, 359, 359, 359, 360, 360, 360, 360], dtype=np.int64)
>>> Y = np.array([240, 241, 240, 241, 240, 241, 240, 241, 121, 122, 123, 358, 359, 360, 121, 122, 359, 360], dtype=np.int64)
我们将创建一个numpy数组,将点组合在一起作为32位浮点数,输入cv2.kmeans()
:
>>> points = np.array([[x, y] for x, y in zip(X,Y)], dtype=np.float32)
最后一件事是运行cv2.kmeans()
并抓住中心:
>>> criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
>>> centers = cv2.kmeans(points, 3, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)[2]
>>> centers
array([[ 122.5 , 240.5 ],
[ 359.3999939 , 359.20001221],
[ 359.3999939 , 121.80000305]], dtype=float32)
当然,如果您需要,可以舍入到最接近的整数。