2016-06-27 10 views
1

Ich habe tatsächlich ein Problem auf openCV3.0. Ich habe 12 Gabor Filter (12 differents orientation) auf 1 Bild verwendet und bestückt. Nun möchte ich alle diese Bilder hinzufügen und dann durch 12 jeden Wert dividieren, um den Mittelwert der 12 Filter zu erhalten. Da diese Bilder RGB sind, muss ich jeden Kanal einzeln bearbeiten. Das Problem ist: Wenn ich alle Werte hinzufügen, ich erhalten Werte> 12, während alle Werte liegen zwischen 0 und 1.Schwimmer hinzufügen openCV3.0

Der Teil des Codes abgehört:

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); 

     } 
    } 
} 

und mat_X, mat_Y und mat_Z werden wie folgt erstellt: mat_X = mat_Y = mat_Z = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));

wie gesagt, alle Werte in vec_split sind zwischen 0 und 1, aber wenn ich aus der Schleife bin, mat_X, mat_Y und mat_Z Werte enthalten> 12 .. der Ausgang des Couts, den ich benutzte:

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

Und ich verstehe nicht seit 0 + 0.507358! = 1.54751; 1.54751 + 0.496143! = 3.00963 ...

Kennt jemand das Problem?

Danke für alle!

Antwort

1

denke ich, ist das Problem hier:

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

Die Art und Weise Sie diese Arrays Ergebnisse in allen drei cv::Mat Objekte initialisieren die gleichen Daten verweisen. Nur eine wird erstellt und so erhöht der Code die Werte in diesem Array dreimal.

Für Informationen verwendet OpenCV einen Referenzzählmechanismus mit cv::Mat und der Zuweisungsoperator erstellt einfach einen neuen Verweis auf vorhandene Daten. Wenn Sie eine echte Deep-Kopie eines cv::Mat erstellen möchten, müssten Sie cv::Mat::clone() verwenden.

So initialisieren statt, etwa so:

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.)); 

Ein Auszug aus the documentation unten für die Nachwelt kopiert:

opencvdoc

+0

Sie Kerl mehr als nur ein wenig schaukeln! Wirklich, das war das Problem und das war etwas, was ich nicht wusste ... Ich werde heute Nacht weniger ignorant ins Bett gehen! Danke nochmal! –