OpenCV - 分配操作员"not working" ?

OpenCV - assign operator "not working"?

本文关键字:not working 操作员 分配 OpenCV      更新时间:2023-10-16

我有一个函数要计算卷积(以测试我们是否使用了filter2D的正确设置),我认为函数体并不重要,所以这里只有标题和结尾:

template<typename T>
cv::Mat conv(const cv::Mat &input, const cv::Mat &kernel) {
    cv::Mat output(input); // or should I rather use output( input.rows, input.cols, input.depth())?
    ...
    return output;
}
cv::Mat result = conv( input, kernel);

在这一点上,我在result中得到了完全无用的结果(这些甚至不是随机数据,它们有一些奇怪的模式,每次运行函数时都会重复)。

当我将函数重写为:时

template<typename T>
void conv(const cv::Mat &input, cv::Mat &output, const cv::Mat &kernel) {
   ...
}
cv::Mat result(input);
conv( input, result, kernel);

一切都很好,结果矩阵包含了它应该包含的内容。

所以我的问题是:第一种方法出了什么问题?我做错什么了吗?为什么分配运算符/函数返回不起作用?

*注:OpenCv版本:extra/OpenCv 2.3.1_a-3(archlinux包)*

当我从opencv存储加载外部数据时,发生了类似的事情,数据丢失,直到我使用data( loaded.clone())

好吧,filter2d或您所做的任何事情似乎都不能"就地"工作,也就是说,当输入和输出相同时。使用功能中的第一行,

cv::Mat output(input); // or should I rather use output( input.rows, input.cols, input.depth())?

您使输出指向与输入相同的数据!这不是的克隆,而是另一个参考!

你想做什么写在你的评论里。另一种选择可能是(取决于您的代码)让输出完全未初始化,因为通常C++OpenCV函数会为您初始化它们的输出矩阵,如果它们是空的。

请注意,即使给出适当的results,你的conv()也会在途中破坏你的input矩阵OpenCV在其内部数据引用机制中不尊重const。是的,这是糟糕的设计。