2016-05-17 257 views
3

嗨,我是OpenCV的初學者。我想通過子矩陣逐步改變我的矩陣。但像素值沒有變化。輸出像素值與輸入像素值相同。此外,我的「wavenoise」功能非常有效。OpenCV通過子矩陣改變矩陣

這是我的代碼;

cv::Mat wave_trans = Mat::zeros(nr, nc, CV_64FC1); 
for (int i = 0; i < L; i++){ 
    Range Hhigh = Range(nc/2, nc-1); 
    Range Hlow = Range(0, nc/2 - 1); 
    Range Vhigh = Range(nr/2, nr-1); 
    Range Vlow = Range(0, nr/2 - 1); 


    Mat wave_trans_temp1 = Mat(wave_trans, Vlow, Hhigh); 
    wave_trans_temp1 = wavenoise(wave_trans_temp1, NoiseVar); 


    Mat wave_trans_temp2 = Mat(wave_trans, Vhigh, Hlow); 
    wave_trans_temp2 = wavenoise(wave_trans_temp2, NoiseVar); 


    Mat wave_trans_temp3 = Mat(wave_trans, Vhigh, Hhigh); 
    wave_trans_temp3 = wavenoise(wave_trans_temp3, NoiseVar); 

    nc = nc/2; 
    nr = nr/2; 
} 

我希望你能幫助我。對不起我的英語不好。

此致敬禮。

+0

這個問題可能是在重新分配矩陣你'wavenoise'功能(這將是有益的,以顯示它)。然後分配結果,將'wave_trans_temp *'變量指向新數據。相反,對'wavenoise'函數的結果使用'copyTo'將值複製到子矩陣中。你需要記住'cv :: Mat'就像一個智能指針 - 賦值只是改變對象的引用,但不會導致數據的深層拷貝。 –

回答

1

cv::Mat一起使用時,請務必記住它是底層數據數組的引用計數句柄。

因此,賦值運算符有兩個(用於我們的目的)重載,它們具有明顯不同的行爲。

第一個就是,一個矩陣:

cv::Mat& cv::Mat::operator= (const cv::Mat& m)

矩陣分配是O(1)的操作。這意味着沒有數據被複制,但數據是共享的,並且引用計數器(如果有的話)增加。

,第二個取一個矩陣表達式:

cv::Mat& cv::Mat::operator= (const cv::MatExpr& expr)

它是否具有正確的

作爲相反的分配操作的第一種形式中,第二形式可以重用已經分配的矩陣大小和類型以適應矩陣表達式結果。

因此,表達如

nc = nc/2; 

將更新的nc的值,因爲nc/2cv::MatExpr

然而,當我們分配cv::Mat,如一個由一些功能

cv::Mat foo(cv::Mat m); 

// ... 
void baz(cv::Mat input) { 
    cv::Mat bar(input); 

    bar = foo(bar); // bar now points to whatever foo returned, input is not changed 
} 

返回要解決這個問題,你可以使用cv::Mat::copyTo你的函數的結果複製到子矩陣/圖。

例如

Mat wave_trans_temp3 = Mat(wave_trans, Vhigh, Hhigh); 
wavenoise(wave_trans_temp3, NoiseVar).copyTo(wave_trans_temp3); 
+0

謝謝丹copyTo功能運行良好。 –

+0

沒問題。但是,如果它解決了您的問題,請將答案標記爲已接受。 –