Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Kameradan gelen görüntüyü ekrana boyama
#1
Merhaba arkadaşlar 

Bir projemde kameradan gelen görüntüyü telefon ekranına yansıtmaya çalışıyorum. Direk gelen görüntüyü Rectangle vcl nesnesine bitmap yönteminden yüklüyorum ama tahmin edeceğiniz gibi çok verimli olmuyor. Bunu daha verimli bir şekilde nesneye nasıl yazabilirim. Bazı sitelerde telefonun gpu sunu kullanarak yapılan yöntemler gördüm fakat kullanırken hata oluşuyor. Fakat kullanırken devamlı hata alıyorum. Bu konuda yardımlarınızı bekliyorum. İyi çalışmalar dilerim.
Cevapla
#2
Video çözünürlüğü düşürdüğünüzde verim artar.

CameraOnSampleBufferReady olayında resmi alıyorsunuz, buna uygun bir thread yapı kurmak kafi.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(12-07-2020, Saat: 15:31)mrmarman Adlı Kullanıcıdan Alıntı: Video çözünürlüğü düşürdüğünüzde verim artar.

CameraOnSampleBufferReady olayında resmi alıyorsunuz, buna uygun bir thread yapı kurmak kafi.

Hocam öncelikle cevabınız için yine teşekkür ediyorum. Thread yapı ile yapmak istiyorum fakat vcl threadın çökmesine sebep oluyor. İçeride Synchronize ettiğimde de threadin bir anlamı kalmıyor. Bende bunun için acaba telefon gpusu kullanılarak yapılan bir yöntem var mı diye siz hocalarımıza sormak istedim.
Hocam altta paylaştığım şekilde bir yapı buldum ama kullanamadım. Devamlı hata veriyor.

4Haayf.jpg
     
procedure TMyObject.onPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);

 function _drawBitmap(const aBitmap: {$IFDEF _USE_TEXTURE}TTexture{$ELSE}Tbitmap{$ENDIF}; const aTopLeft: TpointF; Const aOpacity: Single): boolean;
 var aDestRect: TrectF;
 begin
   Result := False;
   if aBitmap <> nil then begin

     //calculate aDestRect
     aDestRect := canvas.AlignToPixel(
                    TRectF.Create(
                       aTopLeft,
                       aBitmap.Width/ScreenScale,
                       aBitmap.Height/ScreenScale));

     //if the aBitmap is visible
     if ARect.IntersectsWith(aDestRect) then begin

       Result := True;

       {$IFDEF _USE_TEXTURE}
       TCustomCanvasGpu(Canvas).DrawTexture(aDestRect, // ATexRect
                                            TRectF.Create(0,
                                                          0,
                                                          aBitmap.Width,
                                                          aBitmap.Height), // ARect
                                            ALPrepareColor(TCustomCanvasGpu.ModulateColor, aOpacity * AbsoluteOpacity), // https://quality.embarcadero.com/browse/RSP-15432
                                            aBitmap);
       {$ELSE}
       Canvas.DrawBitmap(aBitmap, // ABitmap
                         TRectF.Create(0,
                                       0,
                                       aBitmap.Width,
                                       aBitmap.Height), // SrcRect
                         aDestRect, // DstRect
                         aOpacity * AbsoluteOpacity, // AOpacity
                         samevalue(aDestRect.Width, aBitmap.Width, Tepsilon.Position) and
                         samevalue(aDestRect.height, aBitmap.height, Tepsilon.Position)); // HighSpeed - set interpolation to none
       {$ENDIF};

     end;

   end;
 end;

begin

 _drawBitmap(aBitmap, aPos, 1);

end; 
Cevapla
#4
Aldığınız description ekran kopyasından yola çıkarak quality Embarcadero hesabınız varsa bu linki bir incelemek isteyebilirsiniz.

m5tkdtvlsm0bfqcmqjjc.png
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
(12-07-2020, Saat: 21:11)mrmarman Adlı Kullanıcıdan Alıntı: Aldığınız description ekran kopyasından yola çıkarak quality Embarcadero hesabınız varsa bu linki bir incelemek isteyebilirsiniz.

m5tkdtvlsm0bfqcmqjjc.png

Hocam aynı şifre ile girilebiliyorsa dosyaları indirip test edeceğim.
Cevapla
#6
(12-07-2020, Saat: 14:58)codder71 Adlı Kullanıcıdan Alıntı: Merhaba arkadaşlar

Bir projemde kameradan gelen görüntüyü telefon ekranına yansıtmaya çalışıyorum. Direk gelen görüntüyü Rectangle vcl nesnesine bitmap yönteminden yüklüyorum ama tahmin edeceğiniz gibi çok verimli olmuyor. Bunu daha verimli bir şekilde nesneye nasıl yazabilirim. Bazı sitelerde telefonun gpu sunu kullanarak yapılan yöntemler gördüm fakat kullanırken hata oluşuyor. Fakat kullanırken devamlı hata alıyorum. Bu konuda yardımlarınızı bekliyorum. İyi çalışmalar dilerim.

You can use this code for show camera pic on FMX TImage
put TImage (rename to imgPerson) on form and use code:


procedure TfrmCustomer.SampleBufferReady (Sender: TObject;
  const ATime: TMediaTime);
begin
 try
  TThread.Synchronize (TThread.CurrentThread, SampleBufferSync);
  // Resize the image so that the video is buffered in its original size
  //ımage1.width:=ımage1.bitmap.width;
  //ımage1.height:=ımage1.bitmap.height;
 except on E: Exception do
  ShowMessage ('Webcam BufferReady error:' + E.Message);
 end;
end;

procedure TfrmCustomer.SampleBufferSync;
begin
 try
  VideoCamera.SampleBufferToBitmap (imgPerson.Bitmap, false);
 except on E: Exception do
  ShowMessage ('Webcam BufferSync error:' + E.Message);
 end;
end;
WWW
Cevapla
#7
@gbg

This is the regular and usual method that you gave. @codder71 says this is not fast enought. So that he is looking forward a new method for SampleBufferToBitmap work more effective.


Alıntı:@ "Gbg"

Bu, verdiğiniz kurallı ve olağan yöntemdir. @ "codder71" bunun yeterince hızlı olmadığını söylüyor. Dolayısıyla SampleBufferToBitmap için daha etkili yeni bir yöntem aramaktadır.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
(12-07-2020, Saat: 21:11)mrmarman Adlı Kullanıcıdan Alıntı: Aldığınız description ekran kopyasından yola çıkarak quality Embarcadero hesabınız varsa bu linki bir incelemek isteyebilirsiniz.

m5tkdtvlsm0bfqcmqjjc.png

Merhabalar hocam 

Örneği denemek istediğimde setting kısmında bir hata alıyorum. Acaba sebebi ne olabilir?

Il8FAJ.jpg
Cevapla
#9
Telefon veya emulatörün kameralarına erişim izniniz var mı ?
Kamera listesinin boş olduğu anlamına geliyor diye zannediyorum.
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#10
Şöyle bir durum söz konusu.

Hızlandırıcı unsur olarak kullanılan kaynak Delphi'nin daha önceki sürümleri olduğundan ilgili property/functin/procedure zamanla dildeki gelişmeler ile orantılı değişim gösterebiliyor. 

"GetAvailableCaptureSettings" şeklinde bir geliştirme yapıldı.  Böyle deneyin.

Takıldığınız yerde nokta dahil sonrasını silin ve tekrar nokta işareti koyun. Size en yakın sonuçlar önerilecektir.


Ben kendi projelerimde geleneksel takılmıştım.



    for i := 0 to High(CameraComponent.AvailableCaptureSettings) do
    begin
        Size := TSize.Create(CameraComponent.AvailableCaptureSettings[i].Width, CameraComponent.AvailableCaptureSettings[i].Height);

        if (UsefulSettings.TryGetValue(Size, MaxSetting)) then
        begin
          if ( CameraComponent.AvailableCaptureSettings[i].FrameRate > MaxSetting.FrameRate) then
            UsefulSettings.AddOrSetValue(Size, CameraComponent.AvailableCaptureSettings[i] );
        end
        else
          UsefulSettings.Add(Size, CameraComponent.AvailableCaptureSettings[i] );
    end;



Şeklindeki yapı, gördüğünüz ARRAY tipi yapının muadilidir. Idea
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Listview item Boyama codder71 7 1.513 18-08-2024, Saat: 19:01
Son Yorum: codder71
  Android Gelen Çağrı Durumunu Yakalamak emrahozten 7 3.498 07-11-2022, Saat: 23:54
Son Yorum: engerex
  Layout'un Ekrana sığdırılması, Imagelist, Win32 debug sorunu, Scrollbox Yasemin 6 3.165 08-04-2021, Saat: 15:04
Son Yorum: Mr.X
  gelen çağrıyı yakalama erdogan 8 6.321 16-02-2020, Saat: 19:22
Son Yorum: erdogan
  Firebase Uygulama Kapalı İken Gelen Bildirimdeki Verileri Alma ahmet6513 3 3.960 02-01-2020, Saat: 10:57
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi