Форум: "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.084 c