Obraz z kamery i scanline

0

Witam,
Pobieram sobie obraz z kamery w timerze. Chciałbym uzyskac obraz tylko ze składową czerwoną. Napisałem sobie więc kod który był połączeniem scanline i pixels, ale jak wiadomo takie połączenie nie jest szybkie...

Napisałem więc kod w oparciu o sam scanline. O tyle działa on w innym programie gdy statycznie wczytuję bitmapę z pliku (bmp.LoadFromFile();) ale gdy umieszcze ten sam kod do timera pobierającego obraz, kod nie dziala, czytaj obraz z kamery jest pobierany i wyświetlany na image'u ale obraz posiada wszystkie składowe zamiast tylko czerwonej. Timer ustawiam na 5 sekund (5000 w timerze). Próbowałem robić to na kopiach tej bitmapy ale tez niedziala. Z góry dziękuję za pomoc.

Btw : Wiem że tworzenie i zwalnianie w timerze bitmapy moze byc troche nieoptymalne ale musialem miec pewnosc ze kod w obu programach bedzie pracowal w podobnym "środowisku"...

procedure TForm1.Timer1Timer(Sender: TObject);
var bmp : TBitmap;
    x,y : integer;
    linia : PByteArray;
begin

      bmp := TBitmap.Create;
    //---------ZRZUT DO BITMAPY----------------------------

        SendMessage(FCapHandle,WM_CAP_GET_FRAME, 0, 0);
        SendMessage(FCapHandle, WM_CAP_COPY, 0, 0);

        if Clipboard.HasFormat(CF_Bitmap) then
            bmp.LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle( CF_BITMAP), 0);

    //-----------------------------------------------------
    
   for y := 0 to bmp.Height-1 Do
   begin
     linia := bmp.ScanLine[y];
     x := 0;
      
     while (x < (bmp.Width-1)*4) do
     begin
         // linia[x+2] := 0;
         linia[x+1] := 0;
         linia[x+0] := 0;
         Inc(x,4);
     end;

   end;

  
//---------------------------------------------------------
{
for y := 0 to bmp.Height-1 do
begin

    for x:= 0 to bmp.Width-1 do
        bmp.Canvas.Pixels[x,y]:=RGB(GetRValue(bmp.Canvas.Pixels[x,y]),0,0);

end;
}
//---------------------------------------------------------


    image2.Canvas.Draw(0,0,bmp);
    bmp.Destroy;



end;
0

a jaki masz bmp.PixelFormat?

0

W opcjach kamery mam RGB 24 bit. W delphi obojętnie co ustawie (pf24bit czy pf32bit) nie robi to różnicy.

0

Witam,
Zauważyłem że po wczytaniu tej bitmapy do image, zapisaniu jej do pliku i ponownym wczytaniu do bitmapy funkcja dziala... Z tego co się orientuję różnica pomiędzy bitmapą w programie a ta wczytaną z pliku może tkwić w nagłówku bitmapy który zapewne tworzy/modyfikuje metoda bitmapy SaveToFile(); Oczywiście rozwiązanie obecne jest kompletnie beznadziejne i wypadałoby dobrać się do tego nagłówka ale... Z tego co widziałem w sieci w nagłówku znajdują się informacje o polecie barw, wysokości, szerokości etc, czyli dokładnie takie jakie są właściwości TBitmap. Mam więc pytanie czy jest możliwe że to wina nagłówka, jeśli tak to jak dobrać się do wartości typu HPALETTE czy HBITMAP ? Dzięki za wszelkie sugestie

0

bede strzelal: w opcjach kamery czesto (a moze zawsze?) jest opcja wyboru formatu np

24-bit RGB
CYUV
UYVY
YUY2

moze problem tkwi w tym, ze sterownik kamery przesyla do Twojego programu jakas "dziwna" bitmape?
a jesli chodzi o HPalette.. wpisz w googlach: delphi hpalette.

0

W ustawiniach kamery mam RGB 24 bit. Co ciekawe po tablicy zwróconej przez scanline musze się poruszać z krokiem 4 co sugeruje format RGB 32 bit (BGRA jak udało się ustalić w poprzednim wątku)...

Mój plan jest taki aby wydobyć wszelkie informacje z nagłówka z wczytanej z pliku bitmapy i potem na "sztywno" ustawić odpowiednie wartości, tylko zastanawiam sie co zrobic z uchwytami... Program nie działa bez tego zapisywania i odczytywania z pliku, poczatkowo myslalem ze tablica wskaznikow zwrocona przez scanline zawiera wskazniki w inne miejsce, teraz jednak widac ze cos jest nie tak z bitmapa...

Podstawowe wartości takie jak wysokosc, szerokosc, etc sa bo skanujac po pixelach program dziala... Wiec trzeba by w jakis magiczny sposob porownywac uchwyty i znalezc ktory uchwyt/y się rożnią (nie licząc uchwytu do bitmapy) tylko co potem to juz niemam koncepcji...

0

Czy program działał z Pixels[] a nie dziala ze ScanLine, czy nie działał od początku?

0

Z pixels działa od poczatku, zeby scanline zadzialal trzeba wlasnie te manewry z zapisywaniem i odczytywaniem z pliku robic...

1 użytkowników online, w tym zalogowanych: 0, gości: 1