TroyashkA 12 Жалоба Опубликовано April 23, 2011 Всем привет! Пытаюсь загрузить данные из изображения при помощи библиотеки GDAL и передать эти данные в IplImage. При открытии GRAYSCALE-изображения (1канал/8бит) все в порядке, а при открытии RGB-изображения (3канала/24бит) получаю ерунду. Ну вообщем смотрите сами: p.s. позже напишу руководство как настраивать и юзать GDAL Спасибо за внимание! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 23, 2011 Чуть внимательней надо с памятью работать: int _tmain(int argc, _TCHAR* argv[]) { GDALAllRegister(); // загрузка GDAL //GDALDataset* r_image = (GDALDataset *)GDALOpen("gia_gr.jpg", GA_ReadOnly); // открытие изображения GRAYSCALE (1канал/8бит) GDALDataset* r_image = (GDALDataset *)GDALOpen("gia.jpg", GA_ReadOnly); // открытие изображения COLOR (3канала/8бит) <--- а вот с этим уже проблемы int channelsCount = r_image->GetRasterCount(); // количество каналов изображения int width = r_image->GetRasterXSize(); // ширина int height = r_image->GetRasterYSize(); // высота IplImage* result = cvCreateImage(cvSize(width, height), 8, channelsCount); byte *currentBuffer = (byte *)malloc(width * height * sizeof(byte)); // выделяем буфер для текущего канала for (int chan = 1; chan <= channelsCount; ++chan) // в GDAL каналы считаются с 1 !!! { GDALRasterBand *currentChannel = r_image->GetRasterBand(chan); // получаем канал // чтение данных канала в буфер currentBuffer auto err = currentChannel->RasterIO( GF_Read, // метод доступа к данным 0, // nXOff - смещение 0, // nYOff - смещение width, // nXSize height, // nYSize currentBuffer, // буфер width, // nBufXSize height, // nBufYSize GDT_Byte, // тип данных 0, // nPixelSpace 0 // nLineSpace ); // Запись данных канала в буфер byte* dest_buf = (byte*)result->imageData; byte* src_buf = currentBuffer; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { // Последовательность каналов в GDAL R,G,B // поэтому приходится инвертировать в B,G,R int channelIndex = channelsCount - chan - 1; dest_buf[channelsCount * x + channelIndex] = *src_buf; ++src_buf; } dest_buf += result->widthStep; } } free(currentBuffer); cvShowImage("RESULT", result); cvWaitKey(); cvReleaseImage(&result); cvDestroyAllWindows(); return 0; } P.S. Я рефлекторно поубирал лишние выделения памяти, добавил освобождение. Глаза режет. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано April 23, 2011 А можете указать, ГДЕ именно ошибка была, а то у меня с C++ туговато p.s. у меня этот код раньше функцией был отдельной ... может поэтому лишнего много Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 23, 2011 Блин, я уже удалил проект, неохода заново пенастраивать пути и переименовывать либы. Я просто сделал так, как считал правильным - оно само и заработало. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано April 23, 2011 Блин, я уже удалил проект, неохода заново пенастраивать пути и переименовывать либы. Я просто сделал так, как считал правильным - оно само и заработало. Окей! Огромное спасибо, буду сам копать и разбираться! P.s. cтрочку: int channelIndex = channelsCount - chan - 1; Надо переписать так: int channelIndex = channelsCount - chan; Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах