Как такой код может вернуть такой беспорядок? - PullRequest
1 голос
/ 08 февраля 2011

Таким образом, для более чем 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, но мне возвращается что-то вроде:

-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 

Любые идеи?

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

Ответы [ 4 ]

5 голосов
/ 08 февраля 2011

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

4 голосов
/ 08 февраля 2011

RealColor является двойным. значения это массив целых Вы вкладываете все в целые, не обращая внимания на то, что теряете.

minval / maxval - целые числа, но когда вы берете их разницу, вы помещаете их в число с плавающей точкой. Это не собирается волшебным образом вернуть вам вашу точность. Это ушло.

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

1 голос
/ 08 февраля 2011

Если dif равно 0.0, то вы получите бесконечность, как у вас.

1 голос
/ 08 февраля 2011

diff не имеет значения 0.0, что означает либо

min_element (values, (values ​​+ wh));max_element (значения, (значения + WH));не делает то, что, по вашему мнению, делает

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

...