Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV的findContours方法中的重复项_Python_Opencv_Contour_Opencv Contour - Fatal编程技术网

Python OpenCV的findContours方法中的重复项

Python OpenCV的findContours方法中的重复项,python,opencv,contour,opencv-contour,Python,Opencv,Contour,Opencv Contour,我正在使用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.cvt

我正在使用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()

您正在查找的轮廓对象包含一些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]]])]
如果我们把这一点考虑进去,它就会变得非常明显:


已经很久了,但是

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

hierarchy[0,cn,3]
cn是等高线的索引


完整信息

但根据您的箭头标记,数组不应该以[2,1]结尾。为什么该点只出现一次?@MadhuriPalagummi最后一条边(位于最后一个顶点和第一个顶点之间)是隐式的(轮廓总是闭合的),因此顶点不会重复。(好吧,这没有很好的文档记录,但从源代码和经验中得到了证实)因此,根据这一点,除了第一点之外的每一点都应该列出两次?是这样吗?而且起点始终是终点(如果轮廓是如图中所示的线)?还是最顶端?第一条注释:否。请注意,列表中每个点的出现次数对应于图中绘制的箭头数。|第二条评论:是的,起点也隐含着终点。e、 要描述正方形的轮廓,你需要列出每个角一次。我还没有详细研究算法,以确定它是否始终是最高点。