【问题标题】:How to use OutputArrayOfArrays in C++ OpenCV如何在 C++ OpenCV 中使用 OutputArrayOfArrays
【发布时间】:2018-05-17 02:18:58
【问题描述】:

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

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

我编写此代码是为了测试对 OutputArrayOfArrays 的结果分配,但无济于事:

//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_code\sources\modules\core\src\matrix.cpp, line 1564

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

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

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

为了传递断言,我可以在示例中进行哪些更改?

【问题讨论】:

  • 你的函数应该返回一个bool,但我没有看到返回值。
  • 完全忘记了,谢谢

标签: c++ opencv


【解决方案1】:

您的问题不在OutputArrayOfArrays 中,而是在cv::merge 中,您正在尝试将cv::vector&lt;cv::Mat&gt; 合并到另一个相同类型的对象cv::vector&lt;cv::Mat&gt;,这不是cv::merge 应该做的。此外,您将 B、G 和 R 声明为每个 CV_8UC3 的 3 个通道,因此您的变量 bgr 或 results 的大小 = 9 (3*3)。

结果代码如下所示:

#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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2023-03-19
    • 2021-12-09
    • 2013-02-03
    • 2023-03-06
    相关资源
    最近更新 更多