Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как я победил TCameraComponent


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

Рекомендуемые сообщения

  • 0
Опубликовано
23 часа назад, pan сказал:

Я до конца так и не понял, нужен ли этот Synchronize

Так вроде у вас всё в основном потоке выполняется, зачем его с самим собой синхронизировать? 

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...