2012-02-02 77 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