如何在OpenCV中合并数量不固定的指定大小轮廓?
问题描述
调用cv.findContours()得到数量不固定的轮廓,想要合并它们。已知np.vstack是合适的方法,但示例仅合并了特定的两个轮廓。由于场景中轮廓数量不固定,先按轮廓大小排序,再尝试遍历合并需要的轮廓。
示例代码及输出:
# 示例代码: import cv2 as cv import numpy as np data_contours = cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)[0] data_cnt = sorted(data_contours, key=len, reverse=True) # 获取轮廓尺寸 data_cnt_len = [len(data_cnt[i]) for i in range(len(data_cnt))] print(f"总轮廓数量:{len(data_contours)}") print(f"轮廓尺寸:{data_cnt_len}") # 输出结果: # 总轮廓数量:7 # 轮廓尺寸:[5754, 407, 8, 1, 1, 1, 1]
现在需要合并前两个最大的轮廓(尺寸为5754和407),但当前使用np.vstack的代码仅得到最后一个轮廓的形状,请问如何正确合并以得到形状为(6161,2)的结果?
当前错误代码及输出:
# 当前代码 contour_number = 2 # 合并前两个轮廓 for i in range(contour_number): # 堆叠轮廓 contours = np.vstack(data_cnt[i]) print(contours.shape) #(407,2)
解决方案
问题根源在于循环中每次都给contours重新赋值,而非逐步累积堆叠结果。以下两种方法可以正确合并轮廓:
方法一:直接堆叠选中的轮廓列表
contour_number = 2 # 选取前contour_number个轮廓,一次性完成堆叠 merged_contour = np.vstack(data_cnt[:contour_number]) print(merged_contour.shape) # 输出(6161, 2)
方法二:循环逐步累积堆叠
contour_number = 2 # 初始化合并结果为第一个轮廓 merged_contour = data_cnt[0] # 从第二个轮廓开始循环堆叠 for i in range(1, contour_number): merged_contour = np.vstack([merged_contour, data_cnt[i]]) print(merged_contour.shape) # 输出(6161, 2)
说明
- 方法一更简洁高效,
np.vstack支持直接传入轮廓列表,一次性完成所有选中轮廓的堆叠操作,避免循环内重复赋值的问题。 - 方法二通过循环逐步更新合并结果,先以第一个轮廓为初始值,之后每次将当前轮廓与已合并结果堆叠,适合需要自定义堆叠逻辑的场景。
内容的提问来源于stack exchange,提问作者chowx054
相关产品推荐
相关产品推荐

