2017-03-01 144 views
2

我正在使用python openCV庫來獲取簡單圖像中的輪廓座標。據我所知,輪廓中點的順序將是findContour()方法返回的順序。OpenCV的findContours方法中的重複項

但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

目的你發現輪廓的包含一些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]]])] 

如果我們得出這樣的,它變得相當顯而易見:

+0

Bu t根據你的箭頭標記,數組不應該以[2,1]結束。爲什麼該點只出現一次? – MaPY

+0

@MadhuriPalagummi最後一條邊(在最後和第一個頂點之間)是隱式的(輪廓總是閉合的),所以頂點不會被重複。 (AFAIK沒有很好的記錄,但是從源代碼和經驗中得到證實) –

+0

因此,除了第一點以外,每個點都應該列出兩次? 是嗎? – MaPY