![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разгрузить ЦП при захвате фотографий с веб-камеры [D6, WinXP]
PhotoManiac © (2005-06-09 11:06:00)Привет!
Использую DSPack для того, чтобы с веб-камеры получать текущее изображение. SampleGrabber делает с него фотки, которые складываются на винте. Все работает нормально, но очень сильно жрет проц. По задаче, мне нужно получать кадры примерно раз в секунду.
Можно ли как-то уменьшить нагрузку на ЦП?
WondeRu (2005-06-10 17:11:00) [1]PhotoManiac (10.06.05 16:45) [17]
и чего я не поискал в русскоязычном интернете сначала
сначала нужно искать англоязычном!
PhotoManiac (2005-06-10 16:45:00) [2]Уф! Камень с души! Цель достигнута. При снижении частоты кадровой развертки до 5Гц мое приложение ест 5-10% ЦПУ и модуль System столько же. Ответ обнаружился тут:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=28416
и чего я не поискал в русскоязычном интернете сначала. Но, ничего, пусть ответ будет еще и на этом сайте. :)
Большое спасибо за помощь всем!
PhotoManiac (2005-06-10 16:30:00) [3]>Я ж тебе сказал, что ты путаник, а ты увидел только предложение писать в avi.
Так я ж не поверил. Конечно, я не абсолютно-ясно-мыслящий тип, но все же, мне кажется, что задачу я понял нормально и метод решения наметил правильно. Вот если бы ты указал, где именно я путаюсь...
Боже, за что мне еще и эта головная боль!
Обнаружил исходник, в котором скорость выбирается 5 фреймов в секунду. загрузка ЦП по модулю System падает до 5%, тогда как на 30fps составляет те же 40%, т.е. я добьюсь желаемого, если снижу фреймрейт. Исходник не очень хочется использовать; хочется DSPack. Такое снижение реализуется, на сколько я разобрался, через выбор нового устройства, дьявол, там все просто, но долго разбираться.
Здесь я что-нить напутал?
Если нет, то тогда вопрос, как снизить скорость DSPack ом. Приведенные в форуме на сайте progdigi.com примеры не работают.
Анонимщик1 (2005-06-10 14:32:00) [4]Вот ведь какой упорный. Я ж тебе сказал, что ты путаник, а ты увидел только предложение писать в avi.
Проверь сначала, сильно ли грузится система при простом воспроизведении какой-нибудь чужой программой.
Скомандовать системе нельзя такого, если, конечно, твой фильтр источника не поддерживает какого-то специализированого интерфейса. Можно попробовать дергать менеджер графа фильтров:
Run
// получаем картинку
Pause
// ждем соответствующее время
Run
// получаем картинку
Pause
// ждем соответствующее время
PhotoManiac (2005-06-10 12:42:00) [5]гениальная процедура, но не рабочая, к сожалению. помимо смешивания кислого с пресным, имеет одну важную синтаксическую ошибку, которая бросается в глаза:
N := GetTickCount;
короче!
решить проблему не можем, да? т.е. сказать системе, чтобы видео с меньшей частотой вводила, не возможно?
Ботвин Дмитрий (2005-06-10 11:19:00) [6]Процедура 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 09:13:00) [7]Анонимщик1, писать в avi - точно не прокатит. ты не внимательно читал посты, поэтому тебе не понятно.
WonderRu, создание битмапок во время создания формы ни к чему не привело. расходы остались те же. :(((
Анонимщик1 (2005-06-09 20:43:00) [8]Почему бы тебе писать не в отдельные файлы, а в avi, например.
И вообще, ты сколько всего тут напутал, что распутывать теперь долго. Ты, кажись, не понимаешь, чего делаешь.
PhotoManiac (2005-06-09 15:26:00) [9]//просто создаешь в Креейте: for i := 0 to STEP_COUNT - 1 do Bitmaps[i] := TBitmap.Create;
но основной то тормоз не в этом. не важно, можно и так, разница не велика. Можно ли как-то управлять фреймрейтом, т.е. сделать так, чтобы модуль System отжирал меньше ресурсов?
PhotoManiac (2005-06-09 15:23:00) [10]да, очереди.
WondeRu (2005-06-09 14:54:00) [11]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 14:39:00) [12]странно, но без 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:05:00) [13]PhotoManiac (09.06.05 13:59) [4]
DiscreteSensor1SetData(
как и где вызываешь DiscreteSensor1SetData??? если в таймере, то зачем Sleep(500);?
WondeRu (2005-06-09 14:04:00) [14]PhotoManiac (09.06.05 13:59) [4]
создавай свой массив обектов TBitmap не в цикле захвата, например, в OnCreate формы...!!!
Bitmaps[STEP_COUNT-1].FreeImage; - абсолютно ненужное...
PhotoManiac (2005-06-09 13:59:00) [15]вот код полностью.
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 13:43:00) [16]PhotoManiac (09.06.05 12:41) [2]
Bitmaps[STEP_COUNT-1]
что такое? где создается? какое разрешение?
PhotoManiac (2005-06-09 12:41:00) [17]...А нет никакого кода. просто по таймеру выполняется:
SampleGrabber.GetBitmap(Bitmaps[STEP_COUNT-1]);
WondeRu (2005-06-09 12:19:00) [18]PhotoManiac (09.06.05 11:06)
код в обработчике SampleGrabber покажи!