Как загрузить Argb32 в Eigen Matrix для лучшей производительности?

Учитывая массив Int, изображение Argb32, как я могу загрузить его в собственные матрицы наилучшим образом?

Цель состоит в том, чтобы создать небольшую библиотеку обработки изображений. И в качестве первой части я хочу преобразовать RGB в шкалу серого.

Есть ли способ загрузить int [] в 3 собственные матрицы без копирования памяти?

(когда речь идет о eigen, это библиотека линейной алгебры).


person Poul K. Sørensen    schedule 27.01.2013    source источник


Ответы (1)


Да, используя класс Map‹> с соответствующим внутренним шагом, например:

unsigned char* data = ...;
int w, h; // the width and height
typedef Map<Matrix<unsigned char,Dynamic,Dynamic>, 0, InnerStride<4> > Slide;
Slice red(data, w, h), green(data+1, w, h), blue(data+2, w, h);

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

MatrixXf gray = (red.cast<float>() * 11 + green.cast<float>() * 16 + blue.cast<float>() * 5)/(32.*255.);
person ggael    schedule 27.01.2013
comment
Ницца. Не могли бы вы добавить комментарий о типе среза, карте, работает ли он как матрица. Можно ли сделать красный+синий+зеленый? или его нужно сначала перевести в поплавки. В противном случае я пойду к собственному документу и найду его сам :) - person Poul K. Sørensen; 27.01.2013
comment
да, вы можете добавить красный + зеленый + синий, но с беззнаковым символом вы получите переполнение. Однако вы можете привести к (unsigned) int. Вы даже можете скрыть приведение в тип Slice. - person ggael; 27.01.2013