OpenCV 合并轮廓

问题描述 投票:0回答:1

我想在 cv.findContours() 之后合并不同数量的轮廓。基于这个thread,np.vstack似乎是最好的方法。但是,给出的示例堆叠了两个特定轮廓 5 和 6。轮廓数量在我的情况下有所不同。因此,我能想到的一种方法是,按大小对它们进行排序,然后循环遍历所需的。

# For example:

data_contours = cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)[0]
data_cnt = sorted(data_contours, key=len, reverse=True)

# Find contour sizes
data_cnt_len = [len(data_cnt[i]) for i in range(len(data_cnt))]

print(f"Total number of contours: {len(data_contours)}")
print(f"Contour size: {data_cnt_len}")

# Total number of contours: 7
# Contour size: [5754, 407, 8, 1, 1, 1, 1]

现在,在 for 循环中,我想合并两个最大的轮廓(即 5754 和 407)。我当前使用 np.vstack 的代码仅给出最后一个轮廓形状。如何合并这两个轮廓?应该是(5754+407)=6161或(6161,2)。谢谢!

# Current code

contour_number = 2  # The first two contours

for i in range(contour_number):  
    
    # Stack contours
    contours = np.vstack(data_cnt[i])

print(contours.shape)
#(407,2)
python opencv
1个回答
0
投票

没关系。我遇到了这个thread并找到了解决方案。基本上,循环时追加到列表中是关键。我将在这里留下更新的代码,希望能帮助任何遇到类似问题的人;)

# Updated code

contours = []       # Create a list
contour_number = 2  # The first two contours

for i in range(contour_number):  
    contours.append(data_cnt[i])

contours = np.vstack(contours)

print(contours.shape)
#(6161,2)
© www.soinside.com 2019 - 2024. All rights reserved.