如何在 OpenCV 中使用 OutputArrayOfArrays C++

How to use OutputArrayOfArrays in C++ OpenCV

本文关键字:OutputArrayOfArrays C++ OpenCV      更新时间:2023-10-16

我一直在尝试创建一个函数,使用 OpenCV 代理的函数来接受多种类型的元素(inputArray、OutputArray、OutputArrayOfArrays)。

到目前为止,我已经找到了有关如何使用InputArray和OutputArray的信息,但没有关于OutputArrayOfArrays的信息。

我制作了这段代码是为了测试对 OutputArrayOfArray 的结果赋值,但无济于事:

//Return 3 Mats, each one filled with a different primary color
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);
cv::merge(bgr, results);
}

这在 OpenCV 断言中失败:

OpenCV Error: Assertion failed (dims == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in cv::_OutputArray::create, file C:opencv_codesourcesmodulescoresrcmatrix.cpp, line 1564

我期望得到 3 个 cv::Mats,每个垫子都有一种不同的颜色,以后使用这样的函数:

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

我已经搜索了文档,但没有找到任何有关如何使用 OutputArrayofArray 返回数据的示例。

我可以在我的示例中更改什么以传递断言?

您的问题不在于OutputArrayOfArrays,而在于您尝试cv::vector<cv::Mat>合并到另一个相同类型的对象cv::mergecv::vector<cv::Mat>这不是cv::merge应该做的。此外,您声明BGR每个CV_8UC3为 3 通道,因此您是可变的bgr或大小 = 9 (3*3)results

结果代码如下所示:

#include <opencv2/highgui.hpp>
#include <vector>
template <typename T, typename ... Ts>
void insert_all(std::vector<T> &vec, Ts ... ts)
{   
(vec.push_back(ts), ...);
}

void rgb_mats(cv::Mat& results)
{
std::vector<cv::Mat> bgr;
bgr.reserve(3);
cv::Mat B(100,100, CV_8UC1, cv::Scalar(255,0,0));
cv::Mat G(100,100, CV_8UC1, cv::Scalar(0,255,0));
cv::Mat R(100,100, CV_8UC1, cv::Scalar(0,0,255));
insert_all(bgr, B,G, R);
cv::merge(bgr, results);
}
int main ()
{
cv::Mat rgb_results;
rgb_mats(rgb_results);
}
相关文章:
  • 没有找到相关文章