|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.07.2015, 20:17 | #1 |
Пользователь
Регистрация: 04.04.2011
Сообщений: 63
|
Поворот TBitMap через массив байтов
Здравствуйте. Использую компонент DSPack в связке с vgScene (это прородитель FireMonkey). В SampleGrabber1Buffer использую pBuffer для своих манипуляций, а затем привожу его к типу:
PvgColorArray = ^TvgColorArray; TvgColorArray = array [0..4] of TvgColor; и перевожу его через Skanline в TvgBitMap (TBitMap сам движок не поддерживает). На каком то этапе мне нужно повернуть (очень быстро) картинку на 90°, точка поворота: середина картинки. В движке есть своя функция поворота, но она работает медленно, собственно как и bitblt. У кого-нибуть есть примеры функций поворота через массив байтов ? мне кажется это будет самый быстрый способ, если учесть что массив получаем как входной параметр обработчика. Думаю тут нужно использовать матрицы, но я с ними никогда не работал. P.S. ещё больше мне подошёл бы вариант заставить DSPack сразу же давать повёрнутую картинку (изображение снимается с web-камеры). Последний раз редактировалось Adult_Master; 08.07.2015 в 20:20. |
09.07.2015, 01:51 | #2 |
Форумчанин
Регистрация: 30.06.2015
Сообщений: 353
|
0) Поворот через чего?
1) BitBlt() работает быстро. 2) BitBlt() в принципе не делает поворотов. 3) Матрицы используются в большинстве случаев неявно, а уж поворот 90 градусов... 4) Чем вам PlgBlt() не угодил? 5) Как вы определяете "медленно"? Картинка квадратная? Где она вообще потом использоваться планирует? |
09.07.2015, 16:48 | #3 |
Пользователь
Регистрация: 04.04.2011
Сообщений: 63
|
Цель такая: Есть веб-камера которая выдаёт картинку 1920х1080, нужно это изображение вывести на форму, в таком же размере, но картинка должна быть перевёрнутой (т.е. уже высота 1920 а ширина 1080). Сама картинка на форме это объект vgScene -> TvgBitmap), т.е. в любом случае потребуется конвертация из TBitmap. Перепробовал уже кучу компонентов, пока остановился на DSPack, его граббер выдаёт изображение в виде массива байт, которое крайне быстро переводится в TvgImage, но если начать его переворачивать.....всё тормозит.
Я понимаю что DSPack это всего лишь обёртка над DirectShow, но на его изучение уйдёт масса времени, потому и ищу готовые примеры/решения. |
10.07.2015, 17:17 | #4 | |
Форумчанин
Регистрация: 30.06.2015
Сообщений: 353
|
Цитата:
А зачем вам именно DSPack / vgScene / TvgBitmap ? Просто выводить на окно не пойдёт? Разь: Код:
Код:
Код:
|
|
10.07.2015, 17:17 | #5 |
Форумчанин
Регистрация: 30.06.2015
Сообщений: 353
|
Титири:
Код:
|
11.07.2015, 01:26 | #6 | ||
Пользователь
Регистрация: 04.04.2011
Сообщений: 63
|
Цитата:
Цитата:
DSPack выбрал потому что уже использовал его в своих проектах ранее, и довольно таки успешно, правда размеры видео там были в разы меньше. Я уже поэкспериментировал с DirectShow, в ходе чего выяснилось что тормоза выдаёт не сам DSPack (на который я грешил изначально), а всё таки моя функция обработки. Сейчас более подробно опишу о чём идёт речь: Вот функция обработки, это событие OnBuffer у TSampleGrabber (DSPack): Код:
Я не копал DSPack глубоко, но мне думается эта функция всего лишь callback, так вот, когда я вставляю сюда функцию переворота изображения, то начинаются жуткие тормоза, а спустя какое то время прога вовсе вываливается в AV. Без переворота всё Ок. Я думаю самое быстрое это произвести поворот напрямую в pBuffer это и есть указатель на массив байт, который приводится к типу PvgColorArray т.к. я уже сказал что vgScene не работает с TBitmap, у неё там свои типы. To ResourceSpace сейчас буду экспериментировать с вашими примерами, спасибо за ответы, просто может всё вышеизложенное наведёт ещё на какие то мысли ? Последний раз редактировалось Adult_Master; 11.07.2015 в 02:10. |
||
11.07.2015, 18:31 | #7 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Еще можно попробовать сделать обработку изображения в потоке кидая pBuffer в тело потока а в нем уже делать обработку этого буфера
Последний раз редактировалось Aliens_wolfs; 11.07.2015 в 18:47. |
11.07.2015, 19:18 | #8 |
Пользователь
Регистрация: 04.04.2011
Сообщений: 63
|
Честно говоря не вижу тут смысла в отдельном треде, ибо на обработку уйдёт почти тоже время, а суть в скорости обновления картинки, а не в зависании основного потока и т.д.
|
11.07.2015, 19:43 | #9 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Bitmap вообще тормозит даже в загрузке на больших картинках, я думаю наверное в этом и есть беда небольших подтормаживаний кадров. ScaleLine тоже долгая обработка. Я тут сделал на вашем коде, что для каждого кадра создается свой обработчик картинки, может поможет. И еще одно хотел у вас спросить, когда камера без обработки работает так же тормозит или нет?
Если этот код не поможет, то нужно посмотреть в сторону графических обработчиков типа OpenGL, DirectShow и тому подобных, так как вам нужно делать обработку обращаясь напрямую к ресурсом видеокарты Код:
Последний раз редактировалось Aliens_wolfs; 11.07.2015 в 20:21. |
11.07.2015, 20:53 | #10 |
Пользователь
Регистрация: 04.04.2011
Сообщений: 63
|
Приведённый мной код работает нормально если просто выводить НЕБОЛЬШУЮ картинку на форму (на сцену), при увеличения размера до FULL HD уже появляются небольшие лаги если резко перемещать камеру (когда меняется вся картинка целиком), но тут я думаю виновата сама камера, если же просто двигать объекты в камере то скорость вывода изображения вполне годная для работы. Проблемы начинаются при повороте изображения на 90°, FPS падает, и обновление происходит 1-2 кадра в секунду ...
А кроме поворота мне ещё нужно отзеркалить изображение по вертикали, что бы получить эффект "зеркала" но как ни странно эта функция работает довольно быстро. В общем основная проблема кроется в падении скорости при повороте изображения. За код спасибо, сейчас буду пробовать, о результатах отпишусь. Последний раз редактировалось Adult_Master; 11.07.2015 в 21:00. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перевести массив байтов в int и string на языке Си | iukash | Общие вопросы C/C++ | 2 | 11.05.2012 10:09 |
передача через DDE массив байтов | chertovich | Общие вопросы Delphi | 4 | 16.08.2011 18:27 |
массив байтов в dll | BARNEY | Общие вопросы Delphi | 2 | 10.06.2011 18:52 |
FileStream Read и массив байтов | bondik | Общие вопросы .NET | 5 | 06.10.2010 22:36 |
assembler массив байтов | AlexandrHouse | Помощь студентам | 5 | 01.02.2010 19:03 |