不带子对象的轮廓

2024-10-01 02:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

再见

我在图像上使用了cv2.findContours。然后,提取了轮廓和层次信息。从那里,我如何过滤并只绘制没有子对象的轮廓(据我所知,层次结构数组的第3列中的值为-1)?在

下面是我的代码:my image

from imutils import perspective
from imutils import contours
import numpy as np
import imutils
import cv2

img = cv2.imread('TESTING.png') 
imgs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edged = imgs

cnts = cv2.findContours(edged,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
hierarchy = cnts[2]
ChildContour = hierarchy [0, :,2]
WithoutChildContour = (ChildContour==-1).nonzero()[0]

cntsA = cnts[0] if imutils.is_cv2() else cnts[1]
if not cntsA:
    print ("no contours")



(cntsB, _) = contours.sort_contours(cntsA)

orig = cv2.imread('TESTING.png')
for c in cntsB:


    if cv2.contourArea(c) < 100: 
        continue

    box = cv2.minAreaRect(c)
    box = cv2.boxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)
    box = np.array(box, dtype="int")
    box = perspective.order_points(box)
    cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 2)

screen_res = 972, 648
scale_width = screen_res[0] / img.shape[1]
scale_height = screen_res[1] / img.shape[0]
scale = min(scale_width, scale_height)
window_width = int(img.shape[1] * scale)
window_height = int(img.shape[0] * scale)

cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Image', window_width, window_height)

cv2.imshow("Image", orig)
cv2.waitKey(0)       
cv2.destroyAllWindows()

Tags: importboximgifwindowwidthcv2int
1条回答
网友
1楼 · 发布于 2024-10-01 02:26:01

findContours返回的hierarchy有四列:[下一列,上一列,第一列子列,父列]。正如您所指出的,我们对索引2感兴趣,即第一个孩子。要过滤并只绘制没有子对象的轮廓,可以在WithoutChildContour中的索引上循环。在

cntsA=[ cntsA[i] for i in WithoutChildContour]

下面是相应的片段:

注意:自从opencv 4.0以来,findContours只返回2个值(cnt和层次结构)。在

# ...
hierarchy = cnts[1] #changed index
ChildContour = hierarchy [0, :,2]
WithoutChildContour = (ChildContour==-1).nonzero()[0]

cntsA = cnts[0]
# get contours from indices
cntsA=[ cntsA[i] for i in WithoutChildContour]
# ...

在示例图像上运行:

Inner contours

相关问题 更多 >