我试图找到一种如何制作 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(),则会删除错误。 为什么会出现这个问题?
答案 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;
}