Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi OpenCV und Delphi (https://www.delphipraxis.net/57442-opencv-und-delphi.html)

alf.stefan 21. Nov 2005 14:30


OpenCV und Delphi
 
Hallo zusammen


hat hier in diesem Forum jemand schon was mit openCV von Intel gemacht und das auch noch in Delphi und VCL?
Ich scheitere bis jetzt daran, dass das Imageformat iplImage nicht so ohne weiteres in TBitmap Format konvertiert werden kann. (jedenfalls nicht von mir).

Es muss immer über ein DIB (Device Independent Format) Format gehen.

Super wäre es wenn jemand einen Tip hätte wie man mit einem geänderten iplImage ein Timage.Picture.Bitmap aktualisieren und neu malen lassen kann.

Ein Tutorial "DIB in Delphi" wäre natürlich auch toll.

Ich hoffe mir kann da jemand helfen.

Gruß

Stefan

Robert Marquardt 21. Nov 2005 14:32

Re: OpenCV und Delphi
 
Ich wollte mal eine vollstaendige Konversion der Header machen, aber ich hatte keine Zeit.

alf.stefan 21. Nov 2005 14:42

Re: OpenCV und Delphi
 
und irgendwas allgemeines DIB/Delphi relevantes?

in einer älteren IPL (Intel Image Processing Lib)Version gibt es eine Delphi Anpassung bei der auch ein

iplTranslateDIB um von iplImage nach DIB zu übersetzen
iplConvertFromDIB um zu konvertieren und
iplConvertToDIB grade anders rum.

Aber das funktioniert nicht. Weis jemand darüber vielleicht Bescheid wie man das gangbar machen kann?

Gruß von

Stefan

alf.stefan 22. Nov 2005 15:49

Re: OpenCV und Delphi
 
Ich weiss ja nicht ob es jemand interessiert aber ich habs doch noch hinbekommen.
Jetzt gibt es zwar andere Probleme aber das gehört nicht hierher.

also was ich wollte war eine Procedur die ein pPplImage bekommt und das dann auf einem TImage darstellt.

Dazu war es scheinbar notwendig die Bilddaten im richtigen Format in einen MemoryStream zu kopieren. Der MemoryStream wird dann einfach mit LoadFromStream in das Image geladen und dann Image refresh und fertig.

Wenn jemand so freundlich wäre das mal anzuschauen und einen Komentar abzugeben wäre das sehr willkommen.
Ich bin mir nämlich nicht sicher ob ich das mit den Pointern und alloc und wieder freigeben richtig gemacht habe.


Bis bald

Stefan

Delphi-Quellcode:
procedure showIt(iplImage : pIplImage; image: TImage);
var
   pp : pointer;
   bmih : pBitmapInfoHeader;
   pBmfh : pBitmapFileHeader;
   sz : cardinal;
   ms : TMemoryStream;
   p : pointer;
begin


   ms := TMemoryStream.Create;

   sz := SizeOf(TBitmapFileHeader);
   pp := AllocMem(sz);
   bmih := @(pbyteArray(pp)^[SizeOf(TBitmapInfoHeader)]);


   bmih.biSize := SizeOf(TBitmapInfoHeader);
   bmih.biWidth := iplImage.Width;
   bmih.biHeight := iplImage.Height;
   bmih.biPlanes := 1;
   bmih.biBitCount := iplImage.Depth*iplImage.NChannels;
   bmih.biCompression := BI_RGB;
   bmih.biSizeImage := iplImage.ImageSize;//      ((iplImage.Width+31)div 32*4)*8*iplImage.Height;
   bmih.biXPelsPerMeter :=0;
   bmih.biYPelsPerMeter :=0;
   bmih.biClrUsed :=0;
   bmih.biClrImportant :=0;



//
   StreamDIB(bmih,ms);

   pBmfh := ms.Memory;
//   p := pointer(Cardinal(ms.Memory) + pBitmapFileHeader(ms.Memory)^.bfOffBits);
   p := pointer(Cardinal(pBmfh) + pBmfh^.bfOffBits);

   Move(iplImage^.ImageData^, p^, bmih^.biSizeImage);


   ms.Position :=0;
   image.Picture.Bitmap.LoadFromStream(ms);

   image.Refresh;

   IplDeallocateImage(iplImage);

   ms.Free;
   freeMem(pp,sz);
end;
Delphi-Quellcode:
procedure streamDib(header: pBITMAPINFOHEADER;var ms:TMemoryStream);
var
    memsize: Integer;
    dib :pBitmapInfoHeader;
    pBfh: pBitmapFileHeader;
    i:Integer;
    b : byte;
begin
    memsize := SizeOF(TBitmapFileHeader) + header.biSize +
        (( ((header.biWidth * header.biBitCount) + 31) div 32 ) *4) *
        header.biHeight;
    if (Header^.biClrUsed>0) then Inc(MemSize,256 * sizeof(TRGBQUAD) );
    ms.SetSize(memSize);
    pBfh := ms.Memory;

    pBfh.bfType := $4D42;
    pBfh.bfSize := memsize;
    pBfh.bfOffBits := memsize
    - (( ((header.biWidth * header.biBitCount) + 31) div 32 ) *4) *
        header.biHeight;
    dib := @(pByteArray(pBfh)^[SizeOF(TBitmapFileHeader)]);
    dib^ := header^;
    if (dib^.biClrUsed>0) then begin
        for i := 0 to dib^.biClrUsed-1 do begin
            b := Round((i*255)/(dib^.biClrUsed-1));
            pBitmapInfo(dib).bmiColors[i].rgbRed := b;
            pBitmapInfo(dib).bmiColors[i].rgbGreen := b;
            pBitmapInfo(dib).bmiColors[i].rgbBlue := b;
        end;
    end;
end;

Lumpiluk 12. Dez 2009 23:30

Re: OpenCV und Delphi
 
Die Beiträge sind ja inzwischen uralt.
Gibt es da jetzt vielleicht schon eine einfache Möglichkeit, das in Delphi zu nutzen?

Ich bin vor kurzem auf YouTube-Videos mit diesem Face Tracking gestoßen und zusammen mit OpenGL wäre das bestimmt ziemlich interessant...

alf.stefan 14. Dez 2009 07:22

Re: OpenCV und Delphi
 
Hallo

uralt ist aber ein bisschen übertrieben.

bei openCV regt sich wieder was! da kam jetzt gerade die Version 2.0 raus.
Was die Umsetzung in Delphi angeht gibt es eine Ur-Version
von einem vladimir nextow
die dann von von G. de Santis erweitert wurde um das camShift demo zu verwirklichen
diese habe ich zur Grundlage genommen und auch noch ein paar Funktionen reingepackt.

Einfacher ist das aber mittlerweile nicht geworden!

zu der openCV unit brauch man noch die IPL (Image Processing Library)
oder wahrscheinlich funktioniert auch (vielleicht sogar besser) die IPP (Intel Integrated
Performance Primitives) Bibliothek

Du siehst alles Stückwerk!

Wenn Du trotzdem damit anfangen willst, melde Dich und ich schicke Dir was ich habe.

Gruß

Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz