2011-02-08 3 views
1

Так для более чем 10000 OpenCV изображения, которые я хочу, чтобы выполнить что-то вродеКак такой код может вернуть такой беспорядок?

  int maxVal; 
      int minVal; 
      int wh = w*h; 
      int values[1000]; 
      for(x=0;x<w;x++){ 
       for(y=0;y<h;y++){ 
        double RealColor = cvGetReal2D(source, y, x); 
        values[x*h + y] = RealColor; 
       } 
      } 
      minVal = *min_element(values,(values+wh)); 
      maxVal = *max_element(values,(values+wh)); 
      float dif = maxVal - minVal; 
      float fminVal; 
      fminVal = minVal; 
      for(x=0;x<w;x++){ 
       for(y=0;y<h;y++){ 
        float rc = cvGetReal2D(source, y, x); 
        float normRealColor =(rc - fminVal)/dif; 
        file << normRealColor << " "; 
       } 
       file << endl; 
      }file << endl; 

все мои изображения 8 * 8 размер B & W, но она возвращается ко мне что-то вроде:

-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 
-1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND 

и возвращается это не всегда !!! время от времени я получаю желаемый материал, такой как

0 0 0 0.166667 0.166667 0.333333 0.333333 0.333333 
0.166667 0.166667 0.166667 0.333333 0.333333 0.5 0.5 0.5 
0.333333 0.333333 0.5 0.5 0.666667 0.666667 0.666667 0.833333 
0.5 0.5 0.666667 0.666667 0.833333 0.833333 0.833333 1 
0.666667 0.666667 0.666667 0.833333 0.833333 1 1 1 
0.5 0.666667 0.666667 0.666667 0.833333 0.833333 1 1 
0.5 0.5 0.5 0.666667 0.666667 0.833333 0.833333 0.833333 
0.333333 0.5 0.5 0.5 0.666667 0.666667 0.833333 0.833333 

Любые идеи?

BTW (Я знаю, что есть cvNormalize (источник, источник, 1,0, CV_MINMAX), но мне нужно использовать руки написанный код ...)

+1

Вы не хотите использовать cvGetReal2d в плотной петле. Поскольку вы используете C++, почему бы вам не использовать интерфейс 'cv :: Mat' и использовать один из методов http://opencv.willowgarage.com/documentation/cpp/fast_element_access.html? – etarion

ответ

5

Это результат деления на 0, что означает, что diff равно 0, что означает, что некоторые из ваших изображений «плоские», так что minVal == maxVal.

1

дифф самозабвенно 0,0, что означает либо

min_element (значения, (значения + wh)); max_element (значения, (значения + WH)); не делать то, что вы думаете, что делает

или ваши изображения являются неправильными (вы проверка, которые загружаются действительные изображения?)

1

Если dif является 0.0, то вы бы в конечном итоге с бесконечностями, как у вас.

4

RealColor - это двойной. values ​​- массив из int. Вы делаете все в Ints без учета того, что вы теряете.

minval/maxval - это ints, но когда вы берете их различие, вы кладете его в поплавок. Это не волшебным образом вернет вам вашу точность. Он исчез.

make minval, maxval и значения будут удваиваться вместо ints. И обработайте случай div/0. Попробуйте это и посмотрите, лучше ли это.

Смежные вопросы