我有一個函數來計算卷積(測試我們是否使用了正確的設置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