Autor Téma: FMX, Canvas a vlanka  (Přečteno 622 krát)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 347
  • Karma: 15
    • Verze Delphi: FPC :D
FMX, Canvas a vlanka
« kdy: 11-05-2020, 16:24:20 »
Zdar a silu,

pouzivam RVMedia komponenty pro prijem dat z IP camery, ty nasledne zpracovavam ihned po prijeti a posleze zobrazuji. Prave v eventu prijeti, spoustenem v kontextu zpracovavaciho vlakna potrebuji do obrazku nakreslit kalibracni data. Dokud jsem provozoval kameru jednu, vse ok, ale nyni nahodne dochazi k prehozeni obrazu jednotlivych kamer (problik snimku kamery1 do kamery2) apod.

Kód: Delphi [Vybrat]
  1.   var
  2.     bmp: TBitmap := ABitmap.getBitmap;
  3.   if bmp.Canvas.BeginScene then
  4.   begin
  5.     bmp.Canvas.Stroke.Thickness := 2 * bmp.Canvas.Stroke.Thickness;
  6.     bmp.Canvas.Stroke.Color := TAlphaColorRec.Green;
  7.  
  8.     for x := 1 to cnt do
  9.     begin
  10.       var
  11.         x1: Single := map(x, 1, cnt, 0, bmp.Width - 1);
  12.       bmp.Canvas.DrawLine(pointf(x1, 0), pointf(x1, bmp.Height), 0.5);
  13.  
  14.       bmp.Canvas.Stroke.Kind := TBrushKind.bkSolid;
  15.       bmp.Canvas.Stroke.Thickness := 1;
  16.       bmp.Canvas.Fill.Color := TAlphaColors.Green;
  17.       bmp.Canvas.Font.Size := 36;
  18.       bmp.Canvas.Font.Family := 'Arial';
  19.       bmp.Canvas.Font.Style := [TFontStyle.fsbold];
  20.       bmp.Canvas.FillText(RectF(x1 - 15, 0, x1 + 15, bmp.Height - 100), IntToStr(x - (cnt div 2) - 1), false, 1, [], TTextAlign.taCenter);
  21.     end;
  22.    bmp.EndScene;
  23.     ABitmap.Assign(bmp);
  24.  end;
  25.  

Posleze dojde k uprave obrazu filtry (pres transformacni matrici, tzn uz nejde o zmenu obrazku, ale vicemene jen prehazovani pixelu v pameti). Kdyz Vyse uvedeny kod zakomentuju, k problemum nedochazi.
Je tedy canvas pouzitelny jen v hlavnim vlakne ? Jak to tedy dnes resit - v dobe 64 jadrovych CPU s potrebou realtime upravy obrazu z kamer ? Mam tedy pouzit jine komponenty nez klasiku ?
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1060
  • Karma: 47
    • Verze Delphi: 10.3
Re:FMX, Canvas a vlanka
« Odpověď #1 kdy: 11-05-2020, 16:51:32 »
V seznamu novinek nějaké nedávné verze viděl, že je tBitmap už threadsafe: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Multi-Threading_for_TBitmap,_TCanvas,_and_TContext3D
Nepoužíváš nějakou verzi, kde to ještě threadsafe neměli?

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 347
  • Karma: 15
    • Verze Delphi: FPC :D
Re:FMX, Canvas a vlanka
« Odpověď #2 kdy: 11-05-2020, 17:06:47 »
Nene, aktualni 10.3.x (3 nebo 4, proste posledni). Je mi to divny, preci jen po tom nechci zas tak moc na dnesni dobu. Na grafiku pouzivam gr32 ci jine, ale ted jde jen o to nakresleni car apod - at je videt dopad efektu, tak jsem pouzil tohle. Jako kdyz to nepude, vyrendruju si to sam primo do obrazovych dat, ale.. Chtel jsem si ujednodusit praci (je to docasny kod).
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1146
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:FMX, Canvas a vlanka
« Odpověď #3 kdy: 25-05-2020, 18:05:36 »
Doba se nezmenila. Synchronizace je stále třeba, jen je to asi v nové verzi uživatelsky méně náročné.

Zkus se zaměřit na výběr bitmapy, do které kreslíš. Třeba není problém v canvasu :)

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 347
  • Karma: 15
    • Verze Delphi: FPC :D
Re:FMX, Canvas a vlanka
« Odpověď #4 kdy: 25-05-2020, 18:37:38 »
Bitmapa mi prijde z kamery z RVMedia komponent, tu bych mel mit zde moznost zmenit bez problemu neb neni vubec zobrazena, po ukonceni teto metody se to vraci k rvmedia, ktery ji pak vykresluje. Dokud do ni pres canvas nekreslim, je vse ok. (Hlavni uprava spociva ve filtrech px' = px puvodni).
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2697
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:FMX, Canvas a vlanka
« Odpověď #5 kdy: 25-05-2020, 23:40:40 »
Bitmapa mi prijde z kamery z RVMedia komponent, tu bych mel mit zde moznost zmenit bez problemu neb neni vubec zobrazena, po ukonceni teto metody se to vraci k rvmedia, ktery ji pak vykresluje. Dokud do ni pres canvas nekreslim, je vse ok. (Hlavni uprava spociva ve filtrech px' = px puvodni).

No Canvas, je HW akcelerovan - viz. napr. TCanvasManager v  FMX.Canvas.D2D nebo v jakemkoliv jinem backendu. Neni to jen par byte jako drive ve VCL, muze to byt treba primo v graficke karte. Nevim, zda pouzivas D2D nebo FMX.Canvas.GDIP.

Zkus GlobalUseDirect2D := False; treba se to bude chovat pro tebe jinak. Ale stejne je to divne.
Embarcadero MVP - Czech republic

Offline vektor

  • Nováček
  • *
  • Příspěvků: 1
  • Karma: 0
Re:FMX, Canvas a vlanka
« Odpověď #6 kdy: 19-06-2020, 11:10:45 »
Narazil jsem na něco podobného a omlouvám se, že radím takovou děsnou čuňárnu:
Udělal jsem si svoje bitmapy (celé políčko) doplněné pár vlajkama. Thready do nich malujou a po skončení změny nastaví, že je potřeba to překreslit ven.
V hlavním vlákně je časovač, který změnu z mé bitmapy bitbltne do obrazu.
(Pokud se náhodou jedná o rychlejší "pohyby" a pomalejší zpracování, pak střídám i více svých bitmap pro jeden "výstup".)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:FMX, Canvas a vlanka
« Odpověď #7 kdy: 19-06-2020, 15:13:59 »
Bitmapa mi prijde z kamery z RVMedia komponent, tu bych mel mit zde moznost zmenit bez problemu neb neni vubec zobrazena, po ukonceni teto metody se to vraci k rvmedia, ktery ji pak vykresluje. Dokud do ni pres canvas nekreslim, je vse ok. (Hlavni uprava spociva ve filtrech px' = px puvodni).
Nikdy jsem s tím nic nedělal, ale to míchání signálu ze dvou kamer mi přijde jako problem na straně zdroje. Nevim, co dělá getBitmap a jak je ta BMP případně sdílená, ale nabízí se otázka, proč nepíšeš rovnou do. ABitmap?