Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
14-1128695726
ArtemESC
2005-10-07 18:35
2005.10.30
Кодировки


2-1128592873
leonidus
2005-10-06 14:01
2005.10.30
ANSI код символа EOF


1-1128491589
denmin
2005-10-05 09:53
2005.10.30
Как передать параметр в вызываемую программу?


11-1109718996
gent
2005-03-02 02:16
2005.10.30
Ошибка в KOL / TBitmap.SetHandle.


8-1117729988
sashik
2005-06-02 20:33
2005.10.30
OenGL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский