Перейти к содержимому
Compvision.ru
TroyashkA

GDAL + OpenCV

Recommended Posts

Всем привет! Пытаюсь загрузить данные из изображения при помощи библиотеки GDAL и передать эти данные в IplImage. При открытии GRAYSCALE-изображения (1канал/8бит) все в порядке, а при открытии RGB-изображения (3канала/24бит) получаю ерунду. Ну вообщем смотрите сами:

post-2854-0-03646200-1303567903_thumb.pn

p.s. позже напишу руководство как настраивать и юзать GDAL

Спасибо за внимание!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чуть внимательней надо с памятью работать:

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. Я рефлекторно поубирал лишние выделения памяти, добавил освобождение. Глаза режет.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можете указать, ГДЕ именно ошибка была, а то у меня с C++ туговато :(

p.s. у меня этот код раньше функцией был отдельной ... может поэтому лишнего много

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Блин, я уже удалил проект, неохода заново пенастраивать пути и переименовывать либы. Я просто сделал так, как считал правильным - оно само и заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Блин, я уже удалил проект, неохода заново пенастраивать пути и переименовывать либы. Я просто сделал так, как считал правильным - оно само и заработало.

Окей! Огромное спасибо, буду сам копать и разбираться!

P.s. cтрочку:

int channelIndex = channelsCount - chan - 1;
Надо переписать так:
int channelIndex = channelsCount - chan;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×