Serpilin 1 Жалоба Опубликовано August 16, 2013 Добрый день. Получаю с камеры сжатое в jpeg изображение (массив unsigned char). Нужно без промежуточного сохранения в файл передать его в IplImage, для последующей обработки средствами OpenCV. Прочитал про функцию... CVAPI(IplImage*) cvDecodeImage( const CvMat* buf, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)); но для ее использования данные должны быть помещены в CvMat. Сталкивался ли кто-то с подобной проблемой. Спасибо Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 16, 2013 Да, надо создать матрицу с числом столбцов, равной размеру сжатого изображения. Число строк матрицы равно 1. И скопировать в неё сжатую картинку. Всё. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 19, 2013 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. Дальше, как Вы писали, конвертирую, маштабирую и вывожу в окно. Работает медленно. Имитации видеопотока не получается. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 19, 2013 Ну, дальше надо замерить как долго выполняется каждая операция и из-за чего происходят тормоза. Допустим, изображение декодируется медленно, тогда надо поискать что-то побыстрей. Кроме того, замерять время выполнения (work_time) всё равно необходимо, чтобы делать cvWaitKey не на 33 миллисекунды, а на 33 - work_time. Короче, делай замеры. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 19, 2013 Да... pGetImage2 ~200 миллисекунд cvDecodeImage ~500 миллисекунд Даже если декодировать быстрее, функция получения jpeg все равно медленная. Видимо надо искать другой подход. Думал, что чтение изображения не из файла, а из памяти существенно увеличит скорость выполнения. Но это не так. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 19, 2013 Что-то уж очень медленно получается и на получение, и на декодирование. Ты уверен, что OpenCV скомпилирован в Release? Надо бы проверить декодирование какой-нибудь другой библиотекой. если у тебя процессор интеловский, то лучше Intel jpeg library, которая сейчас входит в состав их IPP. Но можно найти в интернете и отдельную установку. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 19, 2013 хм...в debug компилировал. Переключился в Release. Вот такая ошибка. fatal error LNK1120: 38 неразрешенных внешних элементов Это значит что OpenCV в Release не скомпилирован? Где-то что-то еще прикрутить надо? Ушел читать. P.S Release-версия даст существенный прирост в скорости? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 19, 2013 В релизе библиотеки (которые без _d в конце названия дллки) тоже надо подключить в проекте, как для дебага делали. Да, релиз намного быстрее. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 20, 2013 Nuzhny и Smorodov спасибо! Работает быстрее.. pGetImage2 ~200 миллисекунд так и осталось cvDecodeImage ~170 миллисекунд. Примерно 2-3 кадра в секунду. Маловато. Буду искать другой подход Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 20, 2013 Да, лучше найти что-нибудь побыстрей. Но cvDecodeImage всё равно как-то медленно работает. А ты сам компилировал OpenCV? Если да и твой процессор (какой он, кстати?) поддерживает всякие sse, то надо сооответственно сконфигурировать и перекомпилировать. Быстрее той же IJL не получится, но, если есть желание, можно поэкспериментировать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 20, 2013 Процессор Intel Core2 Quad Q9300 2,5GHz Компилировал сам - это при помощи утилиты CMake? Тогда не сам. Я распаковывал архив содержащий заголовочные файлы и т.д Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 20, 2013 Ну, процессор нормальный, доллжно быть побыстрее декодирование. Странно. Я не знаю, как собираются стандартные сборки OpenCV, выставляется ли в CMake использование всех инструкций. Можешь сам попробовать их пересобрать. А вдруг? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 21, 2013 Nuzhny, а может не так уж и медленно? Я забыл сказать, что это кадр 3648x2752 (10 Mp) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 21, 2013 Ого, какой размер! Тогда точно нормально. Разве что распараллеливать декодирование, а для одного кадра пойдёт. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Serpilin 1 Жалоба Опубликовано August 21, 2013 Распараллеливать. Отличная идея. Спасибо, Nuzhny. Учитывая то, что pGetImage и cvDecodeImage выполняются почти за одинаковое время, можно увеличить fps в два раза. В настройках камеры изменил RESOLUTION с FULL на HALF. Разрешение ученьшилось в два раза, но область, которая попадает в кадр сохранилась неизменной. Теперь pGetImage - 90 ms, cvDecodeImage - 60 ms. При распараллеливании будет ~10 кадров в секунду, а это уже как-то похоже на видео. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано August 21, 2013 Кроме распараллеливания по ядрам операций получения и декодирования, можно ускорить и само декодирование. Есть (гугл находит) библиотеки для многопоточного декодирования на CPU, а также и на GPU. На любой вкус и цвет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах