You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:22:25