Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Разгрузить ЦП при захвате фотографий с веб-камеры   Найти похожие ветки 

 
PhotoManiac   (2005-06-09 11:06) [0]

Привет!
Использую DSPack для того, чтобы с веб-камеры получать текущее изображение. SampleGrabber делает с него фотки, которые складываются на винте. Все работает нормально, но очень сильно жрет проц. По задаче, мне нужно получать кадры примерно раз в секунду.
Можно ли как-то уменьшить нагрузку на ЦП?


 
WondeRu ©   (2005-06-09 12:19) [1]

PhotoManiac   (09.06.05 11:06)
код в обработчике SampleGrabber покажи!


 
PhotoManiac   (2005-06-09 12:41) [2]

...А нет никакого кода. просто по таймеру выполняется:

SampleGrabber.GetBitmap(Bitmaps[STEP_COUNT-1]);


 
WondeRu ©   (2005-06-09 13:43) [3]

PhotoManiac   (09.06.05 12:41) [2]
Bitmaps[STEP_COUNT-1]

что такое? где создается? какое разрешение?


 
PhotoManiac   (2005-06-09 13:59) [4]

вот код полностью.

procedure TForm1.DiscreteSensor1SetData(Sender: TObject);
var i: integer;
begin
 if DiscreteSensor1.CurrentState = dsDuty then
 begin
   sync.Enter;
   if Bitmaps[0] <> nil then Bitmaps[0].Free;
   for i := 0 to STEP_COUNT - 2 do Bitmaps[i] := Bitmaps[i+1];
   Bitmaps[STEP_COUNT-1] := TBitmap.Create;
   Bitmaps[STEP_COUNT-1].FreeImage;
   SampleGrabber.GetBitmap(Bitmaps[STEP_COUNT-1]);
   sync.Leave;
   Sleep(500);
 end;
end;

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


 
WondeRu ©   (2005-06-09 14:04) [5]

PhotoManiac   (09.06.05 13:59) [4]
создавай свой массив обектов TBitmap не в цикле захвата, например, в OnCreate формы...!!!

Bitmaps[STEP_COUNT-1].FreeImage; - абсолютно ненужное...


 
WondeRu ©   (2005-06-09 14:05) [6]

PhotoManiac   (09.06.05 13:59) [4]
DiscreteSensor1SetData(

как и где вызываешь DiscreteSensor1SetData??? если в таймере, то зачем Sleep(500);?


 
PhotoManiac   (2005-06-09 14:39) [7]

странно, но без FreeImage вообще не заработало. черные битмапки показывались.
На счет обработки создания в OnCreate... Мне нужен буффер размером STEP_COUNT кадров. В случае, если я делаю так, как написал, то у меня копируются указатели на TBitmap.

for i := 0 to STEP_COUNT - 2 do Bitmaps[i] := Bitmaps[i+1];

Если создание кадров перенести в OnCreate, то придется копировать изображения, т.е. делать что-то вроде

for i := 0 to STEP_COUNT - 2 do Bitmaps[i].Assign := Bitmaps[i+1]

Что, если я не гоню, значительно менее оптимально, чем создание и удаление объектов.
Я немного слукавил, говоря, что по таймеру. На самом деле - в другом потоке. Sleep(500) притормаживает чуть поток, ограничивая скорость кадров сверху.
Я тут поэкспериментировал... Если в SamlpeGrabber.OnBuffer подождать Sleep(1000), что меня устраивает, то занятость ЦП снижается значительно - с 80, до 50%. Как удалось выяснить, ЦП занимают два процесса - один - это мой. Второй - это System. И если мой процесс после вставки секундной задержки начинает есть вместо 40% ЦП всего 2-10%, то загрузка от процесса System не изменяется вообще. Как я могу сделать так, чтобы и System перестал транжирить(в силу специфики моей задачи) ресурсы ЦП? Может можно ему как частоту кадров ограничить?


 
WondeRu ©   (2005-06-09 14:54) [8]

PhotoManiac   (09.06.05 14:39) [7]
как я понял у тебя кадры загоняются в подобие очереди? Т.е. новый записывается, а старый перетирается...

PhotoManiac   (09.06.05 14:39) [7]
случае, если я делаю так, как написал, то у меня копируются указатели на TBitmap.
for i := 0 to STEP_COUNT - 2 do Bitmaps[i] := Bitmaps[i+1];
Если создание кадров перенести в OnCreate, то придется копировать изображения, т.е. делать что-то вроде
for i := 0 to STEP_COUNT - 2 do Bitmaps[i].Assign := Bitmaps[i+1]
Что, если я не гоню, значительно менее оптимально, чем создание и удаление объектов.

бред... нафига??? просто создаешь в Креейте: for i := 0 to STEP_COUNT - 1 do Bitmaps[i] := TBitmap.Create;


 
PhotoManiac   (2005-06-09 15:23) [9]

да, очереди.


 
PhotoManiac   (2005-06-09 15:26) [10]

//просто создаешь в Креейте: for i := 0 to STEP_COUNT - 1 do Bitmaps[i] := TBitmap.Create;
но основной то тормоз не в этом. не важно, можно и так, разница не велика. Можно ли как-то управлять фреймрейтом, т.е. сделать так, чтобы модуль System отжирал меньше ресурсов?


 
Анонимщик1   (2005-06-09 20:43) [11]

Почему бы тебе писать не в отдельные файлы, а в avi, например.
И вообще, ты сколько всего тут напутал, что распутывать теперь долго. Ты, кажись, не понимаешь, чего делаешь.


 
PhotoManiac   (2005-06-10 09:13) [12]

Анонимщик1, писать в avi - точно не прокатит. ты не внимательно читал посты, поэтому тебе не понятно.
WonderRu, создание битмапок во время создания формы ни к чему не привело. расходы остались те же. :(((


 
Ботвин Дмитрий   (2005-06-10 11:19) [13]

Процедура Sleep не самый лучший вариант задержки - на время
задержки вся прога зависает. Лучше используй задержку в виде:

procedure Delay(Value: Cardinal);
 var
   F, N: Cardinal;
 begin
   N := 0;
   while N <= (Value div 10) do
      begin
        SleepEx(1, True);
        Application.ProcessMessages;
        Inc(N);
      end;
   F:=GetTickCount;
   repeat
      Application.ProcessMessages;
      N := GetTickCount;
   until ((N - F) >= (Value mod 10)) or (N < F);
 end;

Она практически не грузит проц....


 
PhotoManiac   (2005-06-10 12:42) [14]

гениальная процедура, но не рабочая, к сожалению. помимо смешивания кислого с пресным, имеет одну важную синтаксическую ошибку, которая бросается в глаза:
N := GetTickCount;

короче!
решить проблему не можем, да? т.е. сказать системе, чтобы видео с меньшей частотой вводила, не возможно?


 
Анонимщик1   (2005-06-10 14:32) [15]

Вот ведь какой упорный. Я ж тебе сказал, что ты путаник, а ты увидел только предложение писать в avi.
Проверь сначала, сильно ли грузится система при простом воспроизведении какой-нибудь чужой программой.
Скомандовать системе нельзя такого, если, конечно, твой фильтр источника не поддерживает какого-то специализированого интерфейса. Можно попробовать дергать менеджер графа фильтров:
Run
// получаем картинку
Pause
// ждем соответствующее время
Run
// получаем картинку
Pause
// ждем соответствующее время


 
PhotoManiac   (2005-06-10 16:30) [16]

>Я ж тебе сказал, что ты путаник, а ты увидел только предложение писать в avi.
Так я ж не поверил. Конечно, я не абсолютно-ясно-мыслящий тип, но все же, мне кажется, что задачу я понял нормально и метод решения наметил правильно. Вот если бы ты указал, где именно я путаюсь...

Боже, за что мне еще и эта головная боль!
Обнаружил исходник, в котором скорость выбирается 5 фреймов в секунду. загрузка ЦП по модулю System падает до 5%, тогда как на 30fps составляет те же 40%, т.е. я добьюсь желаемого, если снижу фреймрейт. Исходник не очень хочется использовать; хочется DSPack. Такое снижение реализуется, на сколько я разобрался, через выбор нового устройства, дьявол, там все просто, но долго разбираться.
Здесь я что-нить напутал?
Если нет, то тогда вопрос, как снизить скорость DSPack ом. Приведенные в форуме на сайте progdigi.com примеры не работают.


 
PhotoManiac   (2005-06-10 16:45) [17]

Уф! Камень с души! Цель достигнута. При снижении частоты кадровой развертки до 5Гц мое приложение ест 5-10% ЦПУ и модуль System столько же. Ответ обнаружился тут:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=28416
и чего я не поискал в русскоязычном интернете сначала. Но, ничего, пусть ответ будет еще и на этом сайте. :)

Большое спасибо за помощь всем!


 
WondeRu ©   (2005-06-10 17:11) [18]

PhotoManiac   (10.06.05 16:45) [17]
и чего я не поискал в русскоязычном интернете сначала

сначала нужно искать англоязычном!



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.071 c
2-1128513848
Vladimir88
2005-10-05 16:04
2005.10.30
Вещественные числа


2-1128883044
redlord
2005-10-09 22:37
2005.10.30
из dataset в listbox


2-1128563154
Viktop
2005-10-06 05:45
2005.10.30
Формат файла для теста


1-1128684587
XfroSt
2005-10-07 15:29
2005.10.30
Плоский TDateTimePicker


3-1126863221
REP
2005-09-16 13:33
2005.10.30
Задать триггер на ограничение количества записей