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

Загрузка картинки из памяти в IplImage

Recommended Posts

Добрый день.

Получаю с камеры сжатое в jpeg изображение (массив unsigned char). Нужно без промежуточного сохранения в файл передать его в IplImage, для последующей обработки средствами OpenCV.

Прочитал про функцию...

CVAPI(IplImage*) cvDecodeImage( const CvMat* buf, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

но для ее использования данные должны быть помещены в CvMat.

Сталкивался ли кто-то с подобной проблемой.

Спасибо

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


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

Да, надо создать матрицу с числом столбцов, равной размеру сжатого изображения. Число строк матрицы равно 1. И скопировать в неё сжатую картинку. Всё.

  • Like 1

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


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

Nuzhny, спасибо. Работает. Но результат ожидал другой.

Делаю так...


   IplImage *img = 0;

   IplImage *image = 0;

   while(1)

   {

      if(dll.pGetImage2(client1, &data, &size, &capacity, res, zoom, dx, dy))

      {

	// Помещаем данные в матрицу

	CvMat mat =  cvMat(1, size, CV_8UC1, data);

	image = cvDecodeImage(&mat, 1);


	img = cvCreateImage(cvSize(image->width/4, image->height/4), image->depth, image->nChannels);

	cvResize(image, img, CV_INTER_NN	);

	cvShowImage("NewImage", img);

	cvReleaseImage(&img);

        cvReleaseImage(&image);


	char c = cvWaitKey(33);

        // ESC

	if (c == 27)

	  break;

   }

pGetImage - из SDK камеры. В data(char*) получаю jpeg. Дальше, как Вы писали, конвертирую, маштабирую и вывожу в окно. Работает медленно. Имитации видеопотока не получается.

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


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

Ну, дальше надо замерить как долго выполняется каждая операция и из-за чего происходят тормоза.

Допустим, изображение декодируется медленно, тогда надо поискать что-то побыстрей.

Кроме того, замерять время выполнения (work_time) всё равно необходимо, чтобы делать cvWaitKey не на 33 миллисекунды, а на 33 - work_time.

Короче, делай замеры.

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


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

Да...

pGetImage2 ~200 миллисекунд

cvDecodeImage ~500 миллисекунд

Даже если декодировать быстрее, функция получения jpeg все равно медленная.

Видимо надо искать другой подход. Думал, что чтение изображения не из файла, а из памяти существенно увеличит скорость выполнения. Но это не так.

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


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

Что-то уж очень медленно получается и на получение, и на декодирование. Ты уверен, что OpenCV скомпилирован в Release?

Надо бы проверить декодирование какой-нибудь другой библиотекой. если у тебя процессор интеловский, то лучше Intel jpeg library, которая сейчас входит в состав их IPP. Но можно найти в интернете и отдельную установку.

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


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

хм...в debug компилировал.

Переключился в Release. Вот такая ошибка.

fatal error LNK1120: 38 неразрешенных внешних элементов

Это значит что OpenCV в Release не скомпилирован? Где-то что-то еще прикрутить надо?

Ушел читать.

P.S Release-версия даст существенный прирост в скорости?

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


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

В релизе библиотеки (которые без _d в конце названия дллки) тоже надо подключить в проекте, как для дебага делали.

Да, релиз намного быстрее.

  • Like 1

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


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

Nuzhny и Smorodov спасибо! Работает быстрее..

pGetImage2 ~200 миллисекунд так и осталось

cvDecodeImage ~170 миллисекунд.

Примерно 2-3 кадра в секунду. Маловато. Буду искать другой подход

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


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

Да, лучше найти что-нибудь побыстрей.

Но cvDecodeImage всё равно как-то медленно работает. А ты сам компилировал OpenCV? Если да и твой процессор (какой он, кстати?) поддерживает всякие sse, то надо сооответственно сконфигурировать и перекомпилировать. Быстрее той же IJL не получится, но, если есть желание, можно поэкспериментировать.

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


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

Процессор Intel Core2 Quad Q9300 2,5GHz

Компилировал сам - это при помощи утилиты CMake? Тогда не сам. Я распаковывал архив содержащий заголовочные файлы и т.д

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


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

Ну, процессор нормальный, доллжно быть побыстрее декодирование. Странно.

Я не знаю, как собираются стандартные сборки OpenCV, выставляется ли в CMake использование всех инструкций. Можешь сам попробовать их пересобрать. А вдруг?

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


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

Nuzhny, а может не так уж и медленно? Я забыл сказать, что это кадр 3648x2752 (10 Mp)

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


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

Ого, какой размер! Тогда точно нормально. Разве что распараллеливать декодирование, а для одного кадра пойдёт.

  • Like 1

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


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

Распараллеливать. Отличная идея. Спасибо, Nuzhny.

Учитывая то, что pGetImage и cvDecodeImage выполняются почти за одинаковое время, можно увеличить fps в два раза.

В настройках камеры изменил RESOLUTION с FULL на HALF. Разрешение ученьшилось в два раза, но область, которая попадает в кадр сохранилась неизменной. Теперь pGetImage - 90 ms, cvDecodeImage - 60 ms.

При распараллеливании будет ~10 кадров в секунду, а это уже как-то похоже на видео.

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


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

Кроме распараллеливания по ядрам операций получения и декодирования, можно ускорить и само декодирование. Есть (гугл находит) библиотеки для многопоточного декодирования на CPU, а также и на GPU. На любой вкус и цвет.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×