OpenCV ошибка доступа к встроенному пикселю изображения - PullRequest
0 голосов
/ 29 января 2012

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

Я точно определил точную проблему, то есть, по крайней мере, нашел какой-то метод безумия

В целях отладки я выводю не все пиксели, а только строки 5:

Код чистый и простой (но комментарии приветствуются)

int main(){
    Mat src = imread("test.png");
    imshow("SOURCE", src);
    cvtColor(src, src, CV_BGR2GRAY);
    GpuMat gpu_src, gpu_ii;
    gpu_src.upload(src);
    integral(gpu_src, gpu_ii);
    Mat cpu_ii;
    gpu_ii.download(cpu_ii);
    imshow("Just for fun", cpu_ii);
    for (int j = 0; j < 8; j++) {
        for (int i = 0; i < 8; i++) {
            //Center Value: Pixel value at (i,j)
            int center_val = (int)cpu_ii.data[(i * cpu_ii.step) + (j * cpu_ii.elemSize())];
            cout << center_val << endl;
        }
        cout << "next line" << endl;
    }

}

Теперь в первом ряду печатается 0 0 0 ... идеально Второй ряд: 160 64 224 128 32 192 96

Очевидно, что эти результаты неверны. Более конкретно: Ожидаемые результаты для второго значения должны быть равны 320, что, кстати, составляет примерно 320-255. Результаты ясно показывают, что значение начинается с 0, как только результат суммы превышает 255. Как я могу устранить эту проблему?

С уважением,

Ответы [ 2 ]

1 голос
/ 29 января 2012

Значения в пикселях верны, но неверный способ доступа.

Вы можете использовать оператор at:

cout << cpu_ii.at<int>(j, i) << endl;

или, по указателю, использовать целочисленный указатель.img.data возвращает символ *, и если он не приведен к типу int, вы обращаетесь к неправильной позиции памяти:

int* data = (int*)cpu_ii.data;

int center_val = data[(i * cpu_ii.step) + (j * cpu_ii.elemSize())];
cout << center_val << endl;
0 голосов
/ 29 января 2012

Кажется, у вас переполнение, потому что целевое изображение вашего интеграла имеет только один канал с одним байтом. Вы должны попытаться использовать конструктор GpuMap, который получает тип (константы, такие как CV_32UC1) в качестве аргумента.

http://fossies.org/dox/OpenCV-2.3.1a/classcv_1_1gpu_1_1GpuMat.html

Сейчас у меня нет компьютера с установленным openCV, чтобы проверить это, поэтому я могу ошибаться.

...