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

如何在C++ OpenCV中正确使用OutputArrayOfArrays?

解决OpenCV中OutputArrayOfArrays的赋值问题

你遇到的断言错误,核心原因是误用了cv::merge函数——merge的作用是将多个矩阵的通道合并成一个多通道矩阵,而不是用来填充OutputArrayOfArrays这种矩阵集合类型。下面是修改后的正确代码,以及详细的解释:

正确实现代码

最简洁的写法,直接将预定义的矩阵集合赋值给OutputArrayOfArrays:

void rgb_mats(cv::OutputArrayOfArrays results){
    cv::vector<cv::Mat> bgr;
    cv::Mat B(100,100, CV_8UC3, cv::Scalar(255,0,0));
    cv::Mat G(100,100, CV_8UC3, cv::Scalar(0,255,0));
    cv::Mat R(100,100, CV_8UC3, cv::Scalar(0,0,255));
    bgr.push_back(B);
    bgr.push_back(G);
    bgr.push_back(R);
    
    // 直接将Mat集合赋值给OutputArrayOfArrays
    results.assign(bgr);
}

如果需要动态创建矩阵(比如尺寸或数量不确定的场景),可以用这种更灵活的写法:

void rgb_mats(cv::OutputArrayOfArrays results){
    // 先为OutputArrayOfArrays分配内存:3个100x100的CV_8UC3矩阵
    results.create(3, cv::Size(100,100), CV_8UC3);
    
    // 获取可修改的Mat向量引用
    cv::vector<cv::Mat> dest_mats = results.getMatVector();
    
    // 直接为每个矩阵填充颜色
    dest_mats[0] = cv::Scalar(255,0,0);
    dest_mats[1] = cv::Scalar(0,255,0);
    dest_mats[2] = cv::Scalar(0,0,255);
}

为什么原来的代码会出错?

cv::merge(bgr, results)试图把3个三通道矩阵合并成一个9通道的100x100矩阵,但你的调用代码期望的是一个包含3个独立矩阵的vector<cv::Mat>,这种结构完全不匹配,触发了OpenCV内部的断言检查(断言要求输出维度为2且符合合并后的通道结构,和你要的矩阵集合逻辑冲突)。

OutputArrayOfArrays核心使用要点

  • 它是OpenCV封装矩阵集合的代理类型,支持vector<cv::Mat>、cv::Mat*数组等多种输入输出形式
  • 赋值时可以直接用assign()传入已有的vector<cv::Mat>;如果需要动态生成,先用create()指定集合大小、单个矩阵的尺寸和类型,再通过getMatVector()获取可修改的矩阵集合操作
  • 注意和split/merge区分:split是把多通道矩阵拆成多个单通道矩阵,merge是反向操作,它们处理的是单矩阵的通道拆分合并,而非矩阵集合的输出

现在你的调用代码:

cv::vector<cv::Mat> rgb_results;
rgb_mats(rgb_results);
assert(rgb_results.size() == 3);

可以正常通过断言,rgb_results里会包含3个分别填充蓝、绿、红原色的矩阵。

内容的提问来源于stack exchange,提问作者Checo R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:23