LINUX.ORG.RU

Подскажите варианты решения поставленной задачи


0

1

Привет вам, аналитики!

Суть такова - не работе дали задание написать программу для работы с видео-камерой. Для этого существует библиотка, назовем ее camera.dll, в которой содержатся все необходимые для работы с ней функции. Казалось бы, чего тут сложного, ан нет - писать требуют только на Delphi. Для этой библиотеки существует описание, но все оно написано для С++, что, конечно, тоже замечательно, но требуют-то делфи...

Также существует файлик camera.pas, который каким-то череззадовым методом работает с библиотекой и камерой, когда его подключаешь к поделка на Delphi. Ну и «пример» на делфях, где примерно показано, как оно все работает. К слову, автор примера прямо говорит, что делфи тут не годится и писать надо бы на плюсах.

В общем, поковырявшись, покурив мануалы и прочее, картинку я получил. Но опять-таки, есть огромныфй минус - камера отдает картинку в формате RAW, который, как известно, может иметь совершенно разную структуру, ибо почти любую хрень можно назвать RAW. Получая картинку с камеры, ее надо еще и декодировать в BMP, чтоб получить изображение на экране. Все это довольно несложно, я сделал, но е-мое, МЕДЛЕННО! Формирование картинки на экране (одной) занимает почти секунд 5. А начальство требует сделать видео, т.е. надо получить хотя бы 20 картинок в минуту. Чувствую, что как не распараллеливай на потоки программулину, в делфях это сделать тупо нереально. Ну или у меня руки из зада растут.

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

Собственно вопрос - а как бы вы поступили в этой ситуации? Мб можно сделать как-то приложение на плюсах, и у него отбирать изображение в делфи, чтоб его показать? Но это ж винда, тут не получится открыть один файл сразу в двух приложениях...

Как быть, аналитики?

★★★★★

оффтопом

>на плюсах

слежение за памятью и прочим

мне кажется, что в дельфи за памятью следят лучше

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

консольный демон на плюсах, который через что-нибудь общается с дельфевым гуем

lazyklimm ★★★★★
()

Забавляют люди с мировоззрением наемного работника. Тебе платят за то, чтобы ты решил задачу на Дельфи и не тому, кто платит рассказывать о том, что ты хочешь...

Я бы в такой ситуации для начала для себя понял, что если у тебя что-то тормозит на дельфях, то либо оно будет тормозить и на плюсах, либо ты что-то не так делаешь.

Далее рассчитываем, что именно нужно будет сделать на дельфях, чтобы решить задачу. Переводим это в часы и деньги. То же самое делаем для C++. Далее приходим к начальству и разъясняем что почем. Предлагаем свой вариант уже аргументированно. Не надо ожидать, что начальник поведется на твое предложение...

Возможна такая ситуация, что это типичный левак. К твоему начальнику (Иванычу) пришел его знакомый (Семеныч) и в результате Иваныч с Семенычем договорились, что подчиненный Иваныча сделает определенную задачу с конкретными ограничениями. При этом Семеныч что-то заплатит Иванычу. Ну, а Иванычу НАСРАТЬ, сколько по времени будет мудохаться его подчиненный (он же не сам это будет делать).

Выход, если такое происходит регулярно, значит начальнику нет дела до того, насколько эффективно подчиненные решают задачи, и такую работу надо менять. Другой вариант, когда подчиненный вместо решения задачи занимается играми в новые технологии. Типа сегодня я хочу поиграться с C++, завтра с Хаскелем, послезавтра еще с чем-нибудь и, поэтому буду парить мозг начальнику, что нужно решать задачи именно так. А ему, после того, как тебе надоест играться и ты уволишься, нужно будет обеспечить работоспособность этих игрушек.

Короче, тебе нужно понять, почему начальник от тебя хочет именно такого решения, принять, что бабло тебе платят за решение задач клиента (заказчик платит за решение своей задачи, а не за ее правильное по твоему мнению решение и уж точно не за твои игры с новыми технологиями). Далее решить для себя готов ли ты таким образом зарабатывать деньги и для чего конкретно тебе нужна эта наемная работа. Далее принять решение и действовать.

anonymous
()

Видимо для вывода вы используете SetPixel. Используйте или SetBitmapBits или OpenGL или DX или что другое.

Booster ★★
()

а что тут думать - напиши всё на плюсах как надо, да заверни в «делпхи», скажи, что вот - написал, делов та

shty ★★★★★
()

Дело ни разу не в языке, а в не умении его использовать.

Booster ★★
()

Ы... вообще формирование картинки размером в экран руками руками по пикселям занимает десятые доли секунды (я про нормальные ноуты/компы, а не про какие то хитрые встроенные девайсы, про вторые не знаю). ЯП тут ни разу ни при чем, если это не скажем питон - что дельфи, что С тут буду работать примерно одинаково.

Скорей всего тормозит кодек, сохранение той же картинки в png занимает секунды - все таки gz долго ворочается. Че там за RAW льется я опять таки не знаю, но мне сомнительно что фитюлечная веб камера может кодить в такой формат, что потом полноценная железяка 5 сек один кадр разворачивает... в общем как уже писали выше, че та Вы не так делаете;-)

AIv ★★★★★
()

>Как быть, аналитики?

Выполнить работу и забрать бабки.

Shtucer
()

Линукс тут при чём?

Led ★★★☆☆
()
Ответ на: оффтопом от lazyklimm

>консольный демон на плюсах, который через что-нибудь общается с дельфевым гуем

Хм, можно подумать.

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от anonymous

>Я бы в такой ситуации для начала для себя понял, что если у тебя что-то тормозит на дельфях, то либо оно будет тормозить и на плюсах, либо ты что-то не так делаешь.

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

По поводу того, почему делфи. Тут вообще идиотизм, хотя нормальный для нашего НИИ идиотизм. У нас будет САУ на ПЛК, которая будет рулить одной здоровенной железякой. Программулина для ПЛК пишется на специфичном для него языке, а на компе делается морда на делфи, ибо начальник кроме делфи ничего не знает, где оператор будет «жмакать кнопачьки». Поделка каким-то образом будет общаться с плк, но мне это не важно. Так как у нас нет специалистов по плк, делать программу под него будет левый человек, знакомый «супер-пупер-погромист» начальника, который знает только делфи. Также для наблюдения на процессом используется видео камера, не банальная вебка, а здоровенная бандура отечественного производства, с большим разрешением и т.д., через которую они там на что-то будут смотреть. Для нее есть программа, написанная фирмой-изготовителем, программа точно так же лагает и глючит, к слову. Но «операторам» понадобилось, чтоб картинка показывалась в том же интерфейсе, что и управляет всем комплексом. А посколько тот супер-пупер-погромист, который будет писать морду, знает только делфи, то мне, как члену группы, занимающей управлением, надо написать программу на делфи, чтобы тот погромист взял мой код и нагло вставил его в свою поделку, чтоб картинка у операторов была на морде. Идиотизм, да. Полный. Особенно если учесть, что при работе камеры все приложение начинает люто тупить, ибо объемы информации гонять приходится приличные.

Вот такие пироги. Хотя идея насчет демона на сях вполне себе нормальная, надо подумать.

Zhbert ★★★★★
() автор топика
Ответ на: оффтопом от lazyklimm

консольный демон на плюсах, который через что-нибудь общается с дельфевым гуем

Сервис, тогда уж.

Miguel ★★★★★
()

KMPlayer на Delphi работает с видеокамерами без тормозов.
Попробуй найти его исходники, или купить их у корейцев :)

quickquest ★★★★★
()
Ответ на: комментарий от Zhbert

А клиент-серверную модель нельзя сделать? У тебя свой сервер, который отдает картинку, у него свой клиент, который что-то там делает с ПЛК и запрашивает у твоего сервера картинку. Само видео гонять через сокеты, например.

delete83 ★★
()

> Получая картинку с камеры, ее надо еще и декодировать в BMP, чтоб получить изображение на экране. Все это довольно несложно, я сделал, но е-мое, МЕДЛЕННО! Формирование картинки на экране (одной) занимает почти секунд 5.

Я бы на твоем месте покурил варианты вывода картинки на экран и поигрался бы с jpg.

5 секунд на вывод одной картинки - это ты явно что-то делаешь неправильно.

damnemall
()

Посмотри инфу по ключевому слову VFW.

undertaker ★★
()

Хм причем тут линукс? На винфак...

И у тс явно дельфифобия слово «дельфи» встречается в каждой строке.

декодировать в BMP

Используй DirectX.

bhfq ★★★★★
()

Дельфи не на много медленнее плюсов, если, вообще, медленнее. Дело не в языке.

dave ★★★★★
()
Ответ на: комментарий от damnemall

Наброски функции, которая картинку кажет:

http://pastebin.com/XuU8d8qi

Комментарии на русском, уж как ни крути, но чтоб было понятно вообще, что я где делал, решил сделать так, хоть и моветон.

А вообще после разговора с начальником, я его убедил, что демон на сях будет куда круче, тем более, оказывается, что не обязательно казать картинку в реалтайме, достаточно всего лишь сохранить видос на винт.

Теперь все проще стало. Надо всего лишь надергать равок с камеры, а потом собрать из них авишку, которую и показать при просмотре записи.

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от bhfq

Не в фобии дело, я его просто не люблю =) И не писал на нем уже года 4, а сейчас от всех этих := и прочей мути испытаваю какое-то неудобство. Уж лучше я на любимом С напишу.

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

{ ðàçìåð áóôåðà äëÿ ïðèåìà äàííûõ èç êàìåðû }

Подзабывать стал, за что я не люблю комментарии на русском. Спасибо, напомнил.

delete83 ★★
()

что-то ты куда-то не туда. Тормозит оно не потому что делфи. А городить демоны, клиент серверную архитектуру и всякое прочее, это все херней страдать вместо собственно решения задачи.

Waterlaz ★★★★★
()
Ответ на: комментарий от AIv

AIv> вообще формирование картинки размером в экран руками руками по пикселям занимает десятые доли секунды

десятые доли секунды

N*0.1 sec — 10/N fps <= 10fps

TC> А начальство требует сделать видео, т.е. надо получить хотя бы 20 картинок в минуту.

sdio ★★★★★
()

Я бы сделал фильтр для DirectShow. Примеры в SDK есть.

Absurd ★★★
()
Ответ на: комментарий от sdio

При интервальной съемке бывает и реже. Даже если ТС перпеутал минуты с секундами, десятые доли секунды это оценка сверху, у меня для рисования одной точки надо перелопатить довольно много данных и хитрым образом определить ее цвет. В его случае думаю можно и побыстрей сделать, да и даже 10fps это вполне связное видео, для технических то целей... он же не блокбастер снимает.

AIv ★★★★★
()

Дока на либу есть? LoadLibrary() вам в руки.

andreyu ★★★★★
()
Ответ на: комментарий от Zhbert

with Form1.Image1.Picture.Bitmap.Canvas do

Ну дык естественно, какой же дурак пишет попиксельно в канвас, да ещё и так хитро вложенный.

static_lab ★★★★★
()
Ответ на: комментарий от Zhbert

>Так как у нас нет специалистов по плк, делать программу под него будет левый человек, знакомый «супер-пупер-погромист» начальника, который знает только делфи.

Напиши работу с камерой (выгребание с девайса и перегон в RGB-чанк) на сишечке, слинкуйся с camera.dll. Таким образом получишь myCamera.dll, из которого будет торчать пара твоих функций отдающих готовый RGB. А их уже импортируй в Delphi (эт легко делается, в доке к дельфе точно есть). Овцы целы и волки сыты.

Sectoid ★★★★★
()
Ответ на: комментарий от Zhbert

Ну блин, в первый класс, в первый раз. Изучите для начала дельфи. Pixels юзает мегатормозную апи - SetPixel.

Booster ★★
()

1. Делфи с библиотекой работает не череззадовыим методом, а обычным, встроеным, делфовым методом линковки внешних динамических библиотек. Тот pas-файл, через который идёт работа с библиотекой это файл с объявлениями структур и сигнатур библиотеки в синтаксисе Делфи. Это нормальная делфовая практика. Если есть описание библиотеки на C++ (а скорее всего на чистом C ) то не составит труда самому написать такой файлик, или модифицировать существующий. К слову, эти файлы принято называть заголовочными.

2. В плане скорости Делфи не особо-то отличатся от C/C++. Нужно провести профайлинг программы и выяснить где тормозит. Выяснив исправлять. У делфи тут не меньше возможностей чем у плюсов. На крайняк можно особо медленные части написать на делфовом ассемблере.

3. Частота получения новых картинок зависит не только от кода, но от железа камеры, а также от её драйвера

4. Сдаётся мне что вы картинку-то попиксельно конвертируете, небойсь ещё и через PIXELS[] ??? Конвертирование картинки и изменение её размера в таких программах являются наиболее ресурсоёмкими задачами...

dmitryalexeeff
()

Предложу быстрый метод, почти не требующий ассемблерной и указательной магии:

разместить в памяти "сырое" изображение

соорудить TCanvas с форматом пикселей, соответствующим формату пикселей в "сыром" изображении

У=высота картинки

цикл фор по У

вычислить смещения очередной строки в "сыром" изображении

получить указатель на очередную строку Canvas с помощью функции scanline

функцией copy скопировать строку из "сырого" изображения в то место, куда указывает указатель, возвращённый scanline

должно работать шустро

dmitryalexeeff
()
Ответ на: комментарий от dmitryalexeeff

>В плане скорости Делфи не особо-то отличатся от C/C++. Нужно провести профайлинг программы и выяснить где тормозит. Выяснив исправлять. У делфи тут не меньше возможностей чем у плюсов. На крайняк можно особо медленные части написать на делфовом ассемблере.

Тут загвоздка в том, что я уже несколько лет как закоренелый сишник, немного знающий еще java и python. В целом, написать на делыях простенькую программу не сложно, но если надо что более эдакое, то я начинаю неистово тупить, ибо, как я уже сказал, все эти := и прочие онли паскалевые и дельфовые штуки вымораживают мозг и заставляют в бешенстве испражняться кирпичами от негодования. Мб дело в моих мозгах, шизофрении какой или еще чем, но вот так вот. Поэтому, добившись от начальник разрешения писать на любимой сишечке, я напишу на ней. =)

3. Стандартная программа, шедшая в комплекте (или купленная отдельно, я хз) работает вроде бы, видосы кажет, но подтупливает немного, это да.

4. Угу, именно так. Лоханулся =)

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от dmitryalexeeff

Да, можно попробовать и так. Но тут еще ведь вот что - вся эта часть с картинкой по идее должна быть частью огромной «морды» для управления железякой. Т.е. она еще попутно с обработкой картинки должна шевелить массивами данных с датчиков, общаться с плк, строить какие-то графики, отображать статус устройств и т.д. Если все это повесить на одно приложение, то никакого компа не хватит, да еще и если затупит невзначай - будет жопа. Так что тут все же логичнее вынести картинку с камеры в отдельный демон, который будет толкаться из «морды» и писать в файл видео, ну или хотя бы тупо снимать 20 кадров в секунду, после чего (уже после отработки железяки) собирать из них видос, по которому будут оценивать что-то операторы, ибо в процессе работы им камера не нужна, как оказалось.

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

На одно приложение вешать не страшно, если комп не дохлый то его хватит и от «затупит» есть лекарство под названием TThread

dmitryalexeeff
()
Ответ на: комментарий от Zhbert

> 4. Угу, именно так. Лоханулся =)

Я тупо создавал PIL-овское изображение, ручками забивал его (там есть прямой доступ в изображение, в память), а дальше либо в форточку выводил либо в файл. Но видеокодеки жмут не покадрово а существенно более сложным образом, так что надо таки брать какую нить юиюлиотеку для работы с видео...

AIv ★★★★★
()

всё просто. Тебе нужно поместить на форму компоненты TCamera для работы с камерой, TRaw для преобразования из сырого формата и TParalel для паралелизации вычислений.

anonymous
()
Ответ на: комментарий от anonymous

О да... дельфи вообсче прекрасный ЯП! Вот код, смежники прислали в отчет (со вловами - вот типа пример, как надо) мы натурально попадали со стульев. Вот мой любимый фрагмент:

procedure proverka();
begin
   if form1.edit1.Text<>'' then
      if form1.edit2.Text<>'' then
...
	 if form1.edit31.Text<>'' then
            form1.button1.Enabled:=true
	 else form1.button1.Enabled:=false
...
   else form1.button1.Enabled:=false
end;

Сам код вот тут http://a-iv.ru/trash/ptica.pas После этого я перестал ругать студентов за неиспольщуемые временные переменные...

Кто не понял - эта программа генерит форму с 31м полем ввода для задания параметров моделирования, и не дает пользователю нажать Ок пока в каждом окошке что нить не появиться. Потом при нажатии Ок сливает это в текстовый файл вида параметр=значение.

AIv ★★★★★
()
Ответ на: комментарий от Zhbert

Я то на билдере немного писал и в общем сумел разобраться... а шеф к-й никогда ничего такого не встречал при виде объявления идентификаторов выпучил глаза, при виде птицы щастья (могучая вещь) издал странный полувсхлип-полувопль и натурально потек со стула как желе. Присутствующие хотели уже скорую вызвать...

AIv ★★★★★
()
Ответ на: комментарий от Zhbert

Перед копированием сорцов переключайся на русский) Тогда коменты будут читабельны

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Для того чтобы сделать BitBl, нужно заполнит вторичную поверхность. Если её снова заполнять через SetPixel, то ничего хорошего не выйдет.

Booster ★★
()

> Как быть, аналитики?

Переходить на Common LISP.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.