如何在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
相关产品推荐
相关产品推荐

