2016-05-17 11 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を使用する場合は、基になるデータ配列の参照カウントハンドルであることに注意することが重要です。

このように、振る舞いの異なる代入演算子には2つのオーバーロードがあります。

最初のものは、マトリックスをとる:

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

マトリックス割り当てはO(1)操作です。つまり、データはコピーされませんが、データは共有され、参照カウンターがある場合はインクリメントされます。

2つ目は、行列式とる:割り当て動作の第1の形態とは逆として

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

を、それが権利を有する場合、第2の形態は、既に割り当てられた行列を再利用することができサイズとタイプを計算して、行列式の結果に合わせます。

nc/2cv::MatExprあるのでしたがって、そのような

nc = nc/2; 

として発現は、ncの値を更新します。もののようなしかし

、我々は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

Dan copyTo関数がうまくいきました。 –

+0

問題ありません。しかし、それがあなたの問題を解決するならば、答えを受け入れたものとしてマークしてください。 –

関連する問題