2016-06-27 7 views
1

私は実際openCV3.0に問題があります。 1つの画像に12のガボールフィルタ(12種類の向き)を使用し、それらを保管しました。 ここでは、これらの画像をすべて追加し、それぞれの値を12で除算して12個のフィルタの平均を求めたいとします。 これらの画像はRGBであるため、各チャンネルを別々に処理する必要があります。 問題がある:私はすべての値を追加する場合、すべての値が0と1フロートを追加するopenCV3.0

盗聴コードの一部との間にあるが、私は> 12値を得る:

for (i = 0; i < gaborV.size(); ++i) { //gaborV contain the 12 gabor filters 
    std::vector<cv::Mat> vec_split; //I split because of the 3 channels 
    cv::split(gaborV[i], vec_split); 
    for (int k = 0; k < imgCol.rows; ++k) { 
     for (int j = 0; j < imgCol.cols; ++j) { 
      if (k == 1 && j == 1) 
       std::cout << mat_X.at<float>(k, j) << " " << vec_split[0].at<float>(k, j) << std::endl; 
      mat_X.at<float>(k, j) += vec_split[0].at<float>(k, j); 
      mat_Y.at<float>(k, j) += vec_split[1].at<float>(k, j); 
      mat_Z.at<float>(k, j) += vec_split[2].at<float>(k, j); 

     } 
    } 
} 

とmat_X、mat_Y及び mat_X = mat_Y = mat_Z = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));

私が言ったように、vec_split内のすべての値が0と1の間であるが、私は蚊帳の外にいる時、mat_X、mat_Yとmat_Z>は12 .. 出力を値が含まれている:mat_Zは、以下のように作成されています私が使用した寒さの:

0 0.507358 
1.54751 0.496143 
3.00963 0.528832 
4.53887 0.465426 
... and at the end I have 15.9459 

0 + 0.507358!= 1.54751から分かりません。 1.54751 + 0.496143 = 3.00963 ...

誰かがこの問題を理解していますか?

ありがとうございました!

答えて

1

私はこの問題はここにあると思う:

mat_X = mat_Y = mat_Z = cv::Mat(cvSize(imgColNormalize.cols,  
         imgColNormalize.rows), CV_32FC1, cvScalar(0.)); 

あなたが同じデータを参照するすべての3つのcv::Matのオブジェクトでこれらの配列の結果を初期化する方法。 Matが1つしか作成されていないため、コードはこの配列の値を3回インクリメントします。

情報として、OpenCVはcv::Matの参照カウントメカニズムを使用し、代入演算子は既存のデータへの新しい参照を作成するだけです。 cv::Matの本物のディープコピーを作成する場合は、cv::Mat::clone()を使用する必要があります。

ので、代わりに、そのように初期化:

mat_X = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.)); 
mat_Y = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.)); 
mat_Z = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.)); 

後世のために下にコピーされたthe documentationからの抜粋:

opencvdoc

+0

あなたは男少しよりも岩!効果的に、それは問題でした、そして、それは私が知らなかったものでした...私は今夜寝ることが少なく無知です! もう一度ありがとう! –

関連する問題