我有一个函数来计算卷积(测试我们是否使用了正确的设置filter2D
),我认为函数体并不重要,所以这里只是标题和结尾:OpenCV - 赋值运算符“不工作”?
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的版本:额外/ OpenCV的2.3.1_a-3(ArchLinux的包)*
同样的事情也发生在我身上时,我是从加载OpenCV的数据存储和外部数据丢失了,直到我用data(loaded.clone())
如果我比第二个更正确地理解你改变数据(并且我改变他们很多,每个单元格),所有数据被复制到新的“智能指针项目”。如果你看看第二种方法,你会注意到我正在使用'result(input)',它的工作原理比。 – Vyktor 2012-02-02 21:45:36
不,在OpenCV中没有写时复制,请参阅http://stackoverflow.com/questions/6411476/opencv-matoperator-does-it-support-copy-on-write我不知道你的功能在第二种方法中,可能会以重新初始化的方式覆盖结果。然后输入保持不变。 – ypnos 2012-02-02 21:49:38
是的,我读过这个问题和答案,它让我相信我的方法应该工作。不只是第二个。函数体在两个代码中都是相同的(它适用(Gabor)过滤器)。 – Vyktor 2012-02-02 21:58:59