过滤出最小面积矩形-Python OpenCV

过滤出最小面积矩形-Python OpenCV,python,opencv,image-processing,computer-vision,Python,Opencv,Image Processing,Computer Vision,我试图获得最小面积矩形的4个顶点的坐标,这些顶点围绕图像中具有类似特征的一些对象构建,忽略它们是否等于某一组值,如果它们不等于,则将它们添加到列表中 以下是获取顶点的方法: contours, hierarchy = cv2.findContours(mask2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: rect = cv2.minAreaRect(contour)

我试图获得最小面积矩形的4个顶点的坐标,这些顶点围绕图像中具有类似特征的一些对象构建,忽略它们是否等于某一组值,如果它们不等于,则将它们添加到列表中

以下是获取顶点的方法:

contours, hierarchy = cv2.findContours(mask2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
        rect = cv2.minAreaRect(contour) 
        points = cv2.cv.BoxPoints(rect)    
        points = np.int0(points)  
        coordinate_list.append(points)
因此,
包含坐标。我尝试打印
,以下是控制台中打印的部分输出:

[[459 467]
 [459 467]
 [459 467]
 [459 467]]
[[450 466]
 [450 466]
 [450 466]
 [450 466]]
[[306 376]
 [306 376]
 [306 376]
 [306 376]]
这个输出让我感到困惑,因为我不知道如何在代码中编写它们

现在假设我想忽略带有坐标顶点的矩形
((459467),(459467),(459467),(459467),(459467))
((450466),(450466),(450466),(450466))
。我尝试在
坐标列表之前插入以下代码。追加(点)
语句:

if points in [[[459 467], [459 467], [459 467], [459 467]], [[450 466], [450 466], [450 466], [450 466]]]:
    continue
我还尝试了很多方法来显示顶点(比如添加逗号,用普通方括号替换方括号等),希望匹配正确的格式,
存储值,但我似乎找不到正确的答案

如果语句正确,如何编写此


p/s:如果有人对这个问题有更合适的标题,请帮我更改。谢谢

cv2.boxPoints
应仅返回包含轮廓最小跨度边界框的4个坐标。在您的代码中,返回的是一个大小为4x2的
numpy
数组,其中每一行是最小跨度边界框的矩形坐标。得到重复坐标的事实很奇怪

在任何情况下,由于
points
现在是
numpy
数组,因此一种方法是检查返回框坐标的
x
坐标是否在您提供的一组坐标中,对于
y
也是如此

因此,一些
numpy
-ish看起来像这样:

# Store x and y coordinates as column vectors
xcoord = np.array([[459, 450]]).T
ycoord = np.array([[467, 466]]).T

# Run contour detection code
contours, hierarchy = cv2.findContours(mask2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

coordinate_list = []

# Go through each contour...
for contour in contours:
    rect = cv2.minAreaRect(contour) 
    points = cv2.cv.BoxPoints(rect)    
    points = np.int0(points) 

    # Check to see if any rectangle points are in our lists
    if np.any(np.logical_and(xcoords == points[:,0], ycoords == points[:,1])):
        continue

    coordinate_list.append(points)
我首先做的是创建单独的
numpy
数组,其中包含列表中不希望看到的坐标的
x
y
坐标。您需要确保按正确的顺序排列积分。因此,
xcoords[0]
ycoords[0]
属于一个
(x,y)
点。类似地,
xcoords[1]
ycoords[1]
属于一个
(x,y)
点等

请注意,我制作了列向量(
nx1
array),以便可以轻松地进行广播。接下来,对于我们检测到的每个轮廓,获取最小跨度边界框,然后检查此最小跨度边界框中的
x
y
坐标是否为点[:,0]
检查列表中是否有我们不想包含的
x
点在检测到的矩形中的
x
坐标集中被检测到。
y
坐标的
ycoords==点[:,1]
的情况类似。执行
np.logical_和
现在将检查坐标对,并查看我们在
xcoord,ycoord
中定义的两个
(x,y)
对是否都被视为检测到的边界框中的坐标。执行
np.any
检查是否出现此类实例。如果这是
True
,我们将继续并跳过此边界框


输出应该存储在
坐标列表中,您想跳过其坐标的矩形不会出现在该列表中。

我想重复的坐标属于我的图像默认的点,这就是为什么我不想将它们包括在
坐标列表中。
。没问题。在这种情况下,此代码应该删除这些点!既然你说
points
是一个
numpy
数组,那么如果我把它转换成一个列表,然后与我的点列表进行比较,会有什么不同吗?由于我以后需要访问这些点,我可以检查访问
numpy
数组和正常列表是否有任何区别吗?您可以这样做。我利用了它们是numpy阵列这一事实,让我能够使用这些方法有效地确定需要删除的点。非常感谢您的所有回复!!