过滤出最小面积矩形-Python OpenCV
我试图获得最小面积矩形的4个顶点的坐标,这些顶点围绕图像中具有类似特征的一些对象构建,忽略它们是否等于某一组值,如果它们不等于,则将它们添加到列表中 以下是获取顶点的方法:过滤出最小面积矩形-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)
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阵列这一事实,让我能够使用这些方法有效地确定需要删除的点。非常感谢您的所有回复!!