为什么发生fixedSize错误取决于默认参数?

时间:2017-11-30 18:18:27

标签: c++ opencv

我试图找到一种如何制作 Mat类型的默认参数的方法,但它很复杂。但是,今天我发现了这段代码 OutputArray _hist = Mat(),我认为这可能只是 Mat类型的默认参数。因此,我可以制作这个代码并且运行良好,但我仍然无法理解一件事。

int myGetHistogram(InputArray _src, OutputArray _hist = Mat())
{
    Mat src = _src.getMat();
    _hist.create(512,512,CV_8U);
    Mat histImage = _hist.getMat();

    ...

    rectangle(histImage, max_pt1, max_pt2, Scalar(0), -1);
    return max_pt1.x/(histImage.cols/256);
}

在此代码中,会显示此错误消息。

OpenCV错误:断言失败(!fixedSize()||((Mat )obj) - > size.operator()()== _sz)*

如果我将默认参数设置为 OutputArray _hist = Mat(512,512,CV_8U)而不是 OutputArray _hist = Mat(),则会删除错误。 为什么会出现这个问题?

1 个答案:

答案 0 :(得分:1)

在任何一种情况下,您都是从临时OutputArray创建Mat(即this constructor),因此您无法更改大小或数据类型

从OpenCV代码中获取灵感。使用cv::noArray()将输出参数设为可选,然后使用cv::OutputArray::needed确定如何初始化cv::Mat histImage

#include <opencv2/opencv.hpp>

int myGetHistogram(cv::InputArray _src, cv::OutputArray _hist = cv::noArray())
{
    cv::Mat src = _src.getMat();

    cv::Size const HISTOGRAM_SIZE(512, 512);

    cv::Mat histImage;
    if (_hist.needed()) {
        _hist.create(HISTOGRAM_SIZE, CV_8U);
        histImage = _hist.getMat();
    } else {
        histImage = cv::Mat(HISTOGRAM_SIZE, CV_8UC1);
    }

    // ... whatever

    return 1;
}

int main()
{
    cv::Mat a(4, 4, CV_8UC1);
    cv::Mat b;

    myGetHistogram(a);
    myGetHistogram(a, b);

    return 0;
}