OpenCV считывает изображения и управляет их пикселями с целочисленными значениями (например, matlab) - PullRequest
1 голос
/ 14 марта 2011

В Matlab, когда я использую функцию imread, значения пикселей изображения сохраняются в 3D-матрице (из uint8). Значения матрицы находятся в диапазоне от 0 до 255. Но в OpenCV функция imread сохраняет значения в cv::Mat. Когда я пытаюсь увидеть значения пикселей, я вижу значения с плавающей запятой, а когда я пытаюсь преобразовать в целое число, у меня большие значения.

Как мне увидеть cv::Mat компоненты (RGB) со значениями от 0 до 255, как в Matlab?

Заранее спасибо!

Ответы [ 5 ]

1 голос
/ 15 июня 2012
int red = (int)((uchar*)pImg->imageData)[y*((int)pImg->widthStep)+x*3+C];

Это для IplImage. Не знаю, работает ли на Мат. C=(0 or 1 or 2) для цветного канала.

1 голос
/ 14 марта 2011

cv :: Mat можно использовать с любым типом пикселя, если вы используете imread, он создаст cv :: Mat правильного типа.

Изображения с плавающей точкой необычны - вы уверены, что исходные данные имеют плавающую точку, или вы просто печатаете неправильные значения?

Вы можете преобразовать изображение с плавающей точкой в ​​8 бит (CV8UC3) с помощью cvtcolor ()

0 голосов
/ 23 ноября 2012

Вам нужно edges.at<cv::Vec2b>(i,j), а не cv :: Vec2w или cv :: Vec2i.

0 голосов
/ 16 марта 2011

Пример результатов

У меня есть это:

Canny(test,edges,0.9*av[0],2*av[0],3,true);
    for(int i=0;i<edges.rows;i++){
        for(int j=0;j<edges.cols;j++){
            cv::Vec2w& elem = edges.at<cv::Vec2w>(i,j);
            std::cout << elem[0] << " , "<<elem[1] << std::endl;
        }
    }

переменная ребер (cv :: Mat) хранит результат функции cv :: Canny (двоичное изображение) .. когда я пытаюсь увидеть значения пикселей с помощью cv :: Vec2w, у меня есть это для результата: 6408, 2058 1817, 7433 1540, 282 5386, 1024 15, 4867 768, 275 1285, 512 2, 0 0, 0 1, 256 с резюме :: Vec2

0, 0 0, 0 0, 0 0, 0 0, -256 255, -256 0, 0 0, 0

с резюме :: Vec2i

0, 0 0, 0 -16777216, -16776961 0, 0 0, -256 -1, 65535 0, -16777216 65535, 0 0, 0

и так далее ...

Но, например, если я напишу это изображение (imwrite ("image.pgm", edge)), а затем прочту с armadillo (изображение представляет собой одноканальное двоичное изображение), я получу в результате матрица (nx1) со значениями от 0 до 255 .. я знаю .. формат обеих библиотек различен, но .. я предпочитаю: двоичное изображение всегда имеет значения 0 и 255 в одном канале ....

0 голосов
/ 14 марта 2011

Я обычно храню изображения в типе IplImage*, а не cv::Mat. Если я скажу IplImage* frame = (get image somehow...), то я могу сказать frame->imageData, чтобы увидеть интересующие вас значения. Значения упорядочены для изображения RGB в одном массиве [r1, b1, g1, r2, b2, g2, r3, b3, g3, ..., r(height*width), b(height*width), g(height*width)], и я считаю, что они расположены по строкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...