【问题标题】:OpenCV - assign operator "not working"?OpenCV - 分配操作员“不工作”?
【发布时间】:2012-02-03 07:46:46
【问题描述】:

我有一个计算卷积的函数(以测试我们是否对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 package)*

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

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    好吧,似乎filter2d 或您所做的任何事情都不能“就地”工作,也就是说,当输入和输出相同时。在函数的第一行,

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

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

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

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

    【讨论】:

    • 如果我理解正确而不是您更改数据的那一秒(我更改了很多,每个单元格)所有数据都将复制到新的“智能指针项”。如果您看一下第二种方法,您会注意到我使用的是result(input),它的工作原理比它还好。
    • 不,OpenCV 中没有写时复制,请参阅stackoverflow.com/questions/6411476/… 我不知道您在第二种方法中的功能是什么,也许它会以某种方式覆盖结果-初始化。然后输入保持不变。
    • 是的,我已经阅读了那个问题和答案,这让我相信我的方法应该有效。不只是第二个。两个代码中的函数体相同(它应用(Gabor)过滤器)。
    • 我该死的:pastebin.com/0NMQy7wU, pastebin.com/WgNAB6fm,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2022-01-10
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多