如何在Python中使用OpenCV检查包含另一个轮廓的轮廓?

时间:2015-11-28 16:13:26

标签: python opencv numpy image-processing

让我们说我有以下图片,我想用Numpy在Python中用OpenCV进行分析:

Checker board with dots

我将所有白色块标记为轮廓。我还在红色和绿色圆点周围标记轮廓。

如何检查哪个点位于哪个白色块中?

以下是我的尝试:

import numpy as np
import cv2
img = cv2.imread('crapypimg.bmp')
gray = cv2.imread('crapypimg.bmp',0)
ret, thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,1,2)
for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    print len(approx)
    if len(approx)==4:
        print "square"
        cv2.drawContours(img,[cnt],0,(0,0,255),2)
    elif len(approx) == 9:
        print "half-circle"
        cv2.drawContours(img,[cnt],0,(255,255,0),3)
    elif len(approx) > 15:
        print "circle"
        cv2.drawContours(img,[cnt],0,(0,255,255),3)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:1)

import cv2

img = cv2.imread('OFLCp.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)[1]  # ensure binary
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

层次结构是您问题的答案。如果您要检查层次结构,它将看起来像这样:

array([[[-1, -1,  1, -1],
        [ 3, -1,  2,  0],
        [-1, -1, -1,  1],
        [ 4,  1, -1,  0],
        [ 6,  3,  5,  0],
        [-1, -1, -1,  4],
        [ 7,  4, -1,  0],
        [ 9,  6,  8,  0],
        [-1, -1, -1,  7],
        [10,  7, -1,  0],
        [12,  9, 11,  0],
        [-1, -1, -1, 10],
        [-1, 10, -1,  0]]], dtype=int32)

其中每一行都包含该索引处轮廓的层次结构信息。

行= [next_contour_index,previous_contour_index,first_child_contour_index,parent_contour_index]

因此,这里的0是最外面的正方形的索引。 索引2(圆形)处的轮廓的父级为1(正方形)。绘制一对孩子(红色),父母(黄色)。 enter image description here

答案 1 :(得分:0)

如果确定形状没有重叠,则只需将一个点与轮廓相对即可。

您可以为此使用cv2.pointPolygonTest

here提供了教程。