Была задача сохранять надписи с приборов, т.е. сохраняется центральная часть фото, причём для прицеливания на экран выводится тоже только часть изображения с камеры, соответствующая видимой части экрана.
Начитавшись форумов о тормозах, решил что CameraComponent.Quality:=TVideoCaptureQuality.LowQuality это мой вариант, но в процессе отладки заметил, что если в одной процедуре деактивировать CameraComponent и через пару действий снова активировать, тормоза пропадают и на MediumQuality.
Потанцевал с бубном в этом направлении и получил несколько правил для комфортной работы CameraComponent:
1. Включение камеры нужно выполнять, когда закончилась подготовка экрана. Если например включается страница TabControl, на которую выводим изображение с камеры, то в этой процедуре нельзя включать камеру, нужно перенести это действие в Application.OnIdle:
procedure TFormApp.CameraActivate(Sender: TObject; var Done: Boolean);
begin
Done:=true; Application.OnIdle:=nil; CameraComponent.Active:=true;
end;
2. Если включен автофокус CameraComponent.FocusMode:=TFocusMode.ContinuousAutoFocus;, после включения камере надо дать время потупить (пропустить несколько CameraComponentSampleBufferReady):
procedure TFormApp.CameraComponentSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
TThread.Synchronize(TThread.CurrentThread, CameraComponentSampleBufferReadySync);
end;
procedure TFormApp.CameraComponentSampleBufferReadySync;
begin
if CameraActivateStep>0 then CameraActivateStep:=CameraActivateStep-1 else
begin
CameraComponent.SampleBufferToBitmap(CameraBitmapFull,true);
with ImagePositionImg.Bitmap.Canvas do if BeginScene then
try
DrawBitmap(CameraBitmapFull,RectScreenOnCamera,RectScreenOnScreen,1,true);
DrawRect(RectAimOnScreen,1);
finally
EndScene;
end;
end;
end;
Я до конца так и не понял, нужен ли этот Synchronize, в примере эмбры на паскале он был а на си нет...
3. Если камера затупила во время работы, нужно сделать перезапуск в одной процедуре:
Вопрос
pan
Была задача сохранять надписи с приборов, т.е. сохраняется центральная часть фото, причём для прицеливания на экран выводится тоже только часть изображения с камеры, соответствующая видимой части экрана.
Начитавшись форумов о тормозах, решил что CameraComponent.Quality:=TVideoCaptureQuality.LowQuality это мой вариант, но в процессе отладки заметил, что если в одной процедуре деактивировать CameraComponent и через пару действий снова активировать, тормоза пропадают и на MediumQuality.
Потанцевал с бубном в этом направлении и получил несколько правил для комфортной работы CameraComponent:
1. Включение камеры нужно выполнять, когда закончилась подготовка экрана. Если например включается страница TabControl, на которую выводим изображение с камеры, то в этой процедуре нельзя включать камеру, нужно перенести это действие в Application.OnIdle:
Application.OnIdle:=CameraActivate; //CameraComponent.Active:=true;
procedure TFormApp.CameraActivate(Sender: TObject; var Done: Boolean);
begin
Done:=true; Application.OnIdle:=nil; CameraComponent.Active:=true;
end;
2. Если включен автофокус CameraComponent.FocusMode:=TFocusMode.ContinuousAutoFocus;, после включения камере надо дать время потупить (пропустить несколько CameraComponentSampleBufferReady):
procedure TFormApp.CameraComponentSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
TThread.Synchronize(TThread.CurrentThread, CameraComponentSampleBufferReadySync);
end;
procedure TFormApp.CameraComponentSampleBufferReadySync;
begin
if CameraActivateStep>0 then CameraActivateStep:=CameraActivateStep-1 else
begin
CameraComponent.SampleBufferToBitmap(CameraBitmapFull,true);
with ImagePositionImg.Bitmap.Canvas do if BeginScene then
try
DrawBitmap(CameraBitmapFull,RectScreenOnCamera,RectScreenOnScreen,1,true);
DrawRect(RectAimOnScreen,1);
finally
EndScene;
end;
end;
end;
Я до конца так и не понял, нужен ли этот Synchronize, в примере эмбры на паскале он был а на си нет...
3. Если камера затупила во время работы, нужно сделать перезапуск в одной процедуре:
CameraComponent.Active:=false; CameraComponent.Active:=true;
Вдруг кому поможет... Это была Delphi 11.3
2 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.