2012-02-02 60 views
4

我有一个函数来计算卷积(测试我们是否使用了正确的设置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())

回答

1

好吧,看起来filter2d,或者你所做的任何事情,都不起作用,也就是说,当输入和输出是相同的。用你的第一行功能,

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

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

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

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

+0

如果我比第二个更正确地理解你改变数据(并且我改变他们很多,每个单元格),所有数据被复制到新的“智能指针项目”。如果你看看第二种方法,你会注意到我正在使用'result(input)',它的工作原理比。 – Vyktor 2012-02-02 21:45:36

+0

不,在OpenCV中没有写时复制,请参阅http://stackoverflow.com/questions/6411476/opencv-matoperator-does-it-support-copy-on-write我不知道你的功能在第二种方法中,可能会以重新初始化的方式覆盖结果。然后输入保持不变。 – ypnos 2012-02-02 21:49:38

+0

是的,我读过这个问题和答案,它让我相信我的方法应该工作。不只是第二个。函数体在两个代码中都是相同的(它适用(Gabor)过滤器)。 – Vyktor 2012-02-02 21:58:59