Python打开cv角落

时间:2017-12-03 18:26:10

标签: python opencv corner-detection

我试图找到这些三角形角落的像素值。我可以使用哈里斯角,并获得角落所有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())

1 个答案:

答案 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)

当然,如果您需要,可以舍入到最接近的整数。