我想在 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)
没关系。我遇到了这个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)