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

Лидеры

Популярный контент

Показан контент с высокой репутацией 08.02.2025 во всех областях

  1. pan

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

    Была задача сохранять надписи с приборов, т.е. сохраняется центральная часть фото, причём для прицеливания на экран выводится тоже только часть изображения с камеры, соответствующая видимой части экрана. Начитавшись форумов о тормозах, решил что 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
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...