如何在opencv python中查找图像的角点数

如何在opencv python中查找图像的角点数,python,opencv,Python,Opencv,在下图中,我得到70个角,但应该是8个角。 我正在使用下面的代码 import numpy as np import cv2 def find_centroids(dst): ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, 0) dst = np.uint8(dst) # find centroids ret, labels, stats, centroids = cv2.connectedCompone

在下图中,我得到70个角,但应该是8个角。 我正在使用下面的代码

import numpy as np
import cv2
def find_centroids(dst):
    ret, dst = cv2.threshold(dst, 0.01 * dst.max(), 255, 0)
    dst = np.uint8(dst)

    # find centroids
    ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
    # define the criteria to stop and refine the corners
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 
                0.001)
    corners = cv2.cornerSubPix(gray,np.float32(centroids[1:]),(5,5), 
              (-1,-1),criteria)
    return corners

image = cv2.imread("hexa_bron.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)

dst = cv2.cornerHarris(gray, 3, 3, 0.04)

dst = cv2.dilate(dst, None)

# Threshold for an optimal value, it may vary depending on the image.
# image[dst > 0.01*dst.max()] = [0, 0, 255]

# Get coordinates
corners = find_centroids(dst)
# To draw the corners
for corner in corners:
    image[int(corner[1]), int(corner[0])] = [0, 0, 255]
int_corners = np.asarray(corners, dtype = int)
print (len(int_corners))
使用的图像是


如何纠正这一点,使我可以得到8个角。当我使用彩色图像时,我看到了不同。因此,如何使用python查找任何类型图像的角点数量。

您可以使用
cv2.approxPolyDP()
完成此操作。这将有助于指导您的实施

编辑:添加信息以解决OPs修改问题

当我在提供的图像上运行代码时,我得到了16个点,即内部轮廓为8,外部轮廓为8。对于图像中的轮廓,通常会得到两个几乎相同的轮廓。有几种方法可以解决这个问题,最终得到8个角点

以下是原始代码结果。您可以在八个角的每个角看到两个点

导入matplotlib.pyplot作为plt
plt.imshow(灰色,cmap=“灰色”)
plt.散射(内部角点[:,0],内部角点[:,1])

我走的路线是平均点的坐标,这些点之间的距离在一个阈值之内。您可以根据应用程序的需要使用它

mean_corners=np.zero_like(int_corners)
对于idx,枚举中的点(int_角):
平方距离=np.和((内角-点)**2,轴=1)
掩码=平方距离<200平方距离阈值
如果np.和(掩码)!=2:
raise VALUE ERROR(“未选择两个角点”)
#平均两分
平均角点[idx,:]=np.mean(整数角点[mask,:],轴=0)
#只保留唯一的点,因为每个点都有一个副本
唯一角=np.唯一(平均角,轴=0)
使用与上述类似的代码绘制新点

unique_corners
的输出为

[[ 306  426]
 [ 518   60]
 [ 518  792]
 [ 866   60]
 [ 866  235]
 [ 941  792]
 [1042  235]
 [1152  426]]
编辑2:

再稍微修改一下,您也可以简单地增加Harris角点检测的
blockSize
参数。增加会使内角和外角位于同一块内,并返回一个单一的角点——无需求平均值。下面是更新后的行,
blockSize
从3增加到10

dst=cv2.0(灰色,10,3,0.04)

您可以使用
cv2.approxPolyDP()
执行此操作。这将有助于指导您的实施

编辑:添加信息以解决OPs修改问题

当我在提供的图像上运行代码时,我得到了16个点,即内部轮廓为8,外部轮廓为8。对于图像中的轮廓,通常会得到两个几乎相同的轮廓。有几种方法可以解决这个问题,最终得到8个角点

以下是原始代码结果。您可以在八个角的每个角看到两个点

导入matplotlib.pyplot作为plt
plt.imshow(灰色,cmap=“灰色”)
plt.散射(内部角点[:,0],内部角点[:,1])

我走的路线是平均点的坐标,这些点之间的距离在一个阈值之内。您可以根据应用程序的需要使用它

mean_corners=np.zero_like(int_corners)
对于idx,枚举中的点(int_角):
平方距离=np.和((内角-点)**2,轴=1)
掩码=平方距离<200平方距离阈值
如果np.和(掩码)!=2:
raise VALUE ERROR(“未选择两个角点”)
#平均两分
平均角点[idx,:]=np.mean(整数角点[mask,:],轴=0)
#只保留唯一的点,因为每个点都有一个副本
唯一角=np.唯一(平均角,轴=0)
使用与上述类似的代码绘制新点

unique_corners
的输出为

[[ 306  426]
 [ 518   60]
 [ 518  792]
 [ 866   60]
 [ 866  235]
 [ 941  792]
 [1042  235]
 [1152  426]]
编辑2:

再稍微修改一下,您也可以简单地增加Harris角点检测的
blockSize
参数。增加会使内角和外角位于同一块内,并返回一个单一的角点——无需求平均值。下面是更新后的行,
blockSize
从3增加到10

dst=cv2.0(灰色,10,3,0.04)

感谢上述内容,您能否建议如何获取每个拐角处的内角和外角?在运行您提供的上述代码时,我得到了错误,即值错误:两个拐角点不正确selected@k_p玩距离阈值。出于调试目的,故意将该错误消息放在其中。这意味着您在累加器中获得1或3+点。至于角度,我需要再多玩一点。我相信
approxPolyDP
以有序列表的形式返回数据,这意味着您可以进行一些数学/几何运算来计算由3个相邻点创建的角度。再一次,我需要确认如果可能的话,你能帮我找到每个角点的角度值多少,一旦你充实了角点算法,我会用你的角度问题创建一个单独的问题/帖子。这个问题可以解决点排序和角度计算。展示你最初的努力,并链接到这篇文章。当我有更多的时间时,我很乐意稍后提供帮助。谢谢上面的内容。你能建议如何获得每个拐角处的内角和外角吗selected@k_p玩距离阈值。出于调试目的,故意将该错误消息放在其中。这意味着您在累加器中获得1或3+点。至于角度,我需要再多玩一点。我相信
approxPolyDP
以有序列表的形式返回数据,这意味着您可以进行一些数学/几何运算来计算由3个相邻点创建的角度。再一次,我需要确认如果可能的话,你能帮我找到每个角点的角度值多少,一旦你充实了角点算法,我会用你的角度问题创建一个单独的问题/帖子。这个问题可以解决波因