【问题标题】:Duplicates in findContours method of OpenCVOpenCV的findContours方法中的重复项
【发布时间】:2017-07-21 00:12:33
【问题描述】:

我正在使用 python openCV 库来获取简单图像中轮廓的坐标。据我了解,轮廓中点的顺序将是 findContour() 方法返回的顺序。

但是findContour()返回的点集有重复,如果顺序保留,怎么会有重复呢?

如何读取输出?

这里是代码

import numpy as np
import cv2
from pylab import plot,show

from PIL import Image


def get_contours(im):

  imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  ret,thresh = cv2.threshold(imgray,127,255,0)
  im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  return im2, contours, hierarchy

def main():
    im = cv2.imread('border.jpeg')

    contour_image, contours, hierarchy = get_contours(im)

    contour_points = []
    for pt in contours[1]:
        contour_points.append((pt[0][0],pt[0][1]))
        plot(pt[0][0],pt[0][1])

    if len(contour_points)!= len(set(contour_points)):
        print "has_duplicates"
    else:
        print "no duplicates"

main()

Here is the image

【问题讨论】:

    标签: python opencv contour opencv-contour


    【解决方案1】:

    您要找到其轮廓的对象包含大约 1 像素宽的“瓶颈”,因此相对两侧的边缘共享一个顶点。

    最好用图片来说明这一点。

    在 4x5 像素图像中想象这种情况:

    让我们运行一个简短的脚本来找到它的轮廓:

    import cv2
    import numpy as np
    
    a = np.array([[0,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]],dtype=np.uint8)
    >>> _, contours, _ = cv2.findContours(a,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    >>> print contours
    [array([[[2, 1]],
           [[1, 2]],
           [[2, 3]],
           [[1, 2]]])]
    

    如果我们把它画进去,就很明显了:

    【讨论】:

    • 但是根据你的箭头标记,数组不应该以 [2,1] 结尾。为什么那个点只出现一次?
    • @MadhuriPalagummi 最后一条边(在最后一个顶点和第一个顶点之间)是隐式的(轮廓始终是闭合的),因此顶点不会重复。 (AFAIK 这没有很好的记录,但从源代码和经验证实)
    • 那么按照这个,除了第一个点之外的每个点都应该列出两次?对吗?
    • 而且起点总是终点(如果轮廓是如图中的线)?还是最高点?
    • 第一条评论:没有。请注意,列表中每个点的出现次数对应于图像中绘制的箭头数。 |第二条评论:是的,起点也是隐含的终点。例如要描述正方形的轮廓,您需要列出每个角一次。算法我没有详细研究过,能不能说是不是一直是最高点。
    【解决方案2】:

    好久不见,但也...

    也许您可以使用层次结构变量中存在的父级和子级。 它对于过滤同一级别的轮廓很有用。 您可以通过这样的索引访问形状的父编号。

    hierarchy[0,cn,3]
    

    cn 是轮廓的索引。

    完整资料HERE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 2019-08-02
      • 2012-12-14
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多