gpt4 book ai didi

c++ - OpenCV - 分配运算符 "not working"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:28 26 4
gpt4 key购买 nike

我有一个计算卷积的函数(测试我们是否使用了正确的 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 函数会为您初始化它们的输出矩阵(如果它们为空)。

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

关于c++ - OpenCV - 分配运算符 "not working"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9120352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com