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

最佳答案

您正在查找轮廓的对象包含一些 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]]])]

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

关于python - OpenCV 的 findContours 方法中的重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42535597/

10-13 09:37