От IPLImage к мату

Я хорошо знаком с форматом IPL-изображения, используемым в OpenCV 1.1. Однако я использую последнюю версию 2.4 и хочу переключиться на интерфейс С++ OpenCV. Вот метод, с помощью которого я получаю доступ к пикселям изображения:

int step = img->widthStep;
int height = img->height;
int width = img->width;
unsigned char* data = (unsigned char*) img->imageData;

for (int i=0; i<height; i++)
{
    for (int j=0; j<step; j+=3)          // 3 is the number of channels.
    {
        if (data[i*step + j] > 200)      // For blue
            data[i*step + j] = 255;

        if (data[i*step + j + 1] > 200)  // For green
            data[i*step + j + 1] = 255;

        if (data[i*step + j + 2] > 200)  // For red
            data[i*step + j + 2] = 255;
    }
} 

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


person Soumyajit    schedule 07.05.2013    source источник


Ответы (1)


Во-первых, вы можете проделать ту же операцию с IPLImage и с помощью встроенного конструктора Mat преобразовать его.

Во-вторых, ваш код кажется слишком сложным, поскольку вы выполняете одну и ту же операцию для всех трех измерений. Следующее более аккуратно (в нотации Mat):

unsigned char* data = (unsigned char*) img.data;

for (int i = 0; i < image.cols * image.rows * image.channels(); ++i) {
  if (*data > 200) *data = 255;
  ++data;
}

Если вы хотите, чтобы пороги для каналов были разными, то:

unsigned char* data = (unsigned char*) img.data;
assert(image.channels() == 3);

for (int i = 0; i < image.cols * image.rows; ++i) {
  if (*data > 200) *data = 255;
  ++data;
  if (*data > 201) *data = 255;
  ++data;
  if (*data > 202) *data = 255;
  ++data;
}
person guinny    schedule 07.05.2013
comment
Делать все в IPL-образе и потом конвертировать обратно - будет ли это достаточно быстро? Я не хочу, чтобы этот процесс занимал дополнительное время. И что касается усложнения - это всего лишь пример кода, предположим, мне нужно указать разные пороговые значения для красного, зеленого и синего. Будет ли тогда работать ваш метод? - person Soumyajit; 07.05.2013
comment
Когда вы конвертируете между Mat и IplImage, у вас есть возможность копировать данные или нет. Если вы не копируете, накладные расходы очень малы. Даже если вы скопируете, я сомневаюсь, что накладные расходы будут значительными, учитывая, что вся ваша обработка занимает больше 1 секунды или около того. Добавлен случай для разных порогов. - person guinny; 08.05.2013
comment
Ваш код не работает, если в матрице есть шаг. Это тот случай, например. для заголовков матриц, созданных как ROI другой матрицы. Используйте итераторы или доступ по указателю строки, чтобы избежать таких ошибок! - person ypnos; 25.10.2013