RGB Farben eines C++-Grafikobjektes auslesen
-
Hallo zusammen !
Ich habe mit VC++ 6 ein Grafikobjekt (Picture) auf meine Form plaziert. Jetzt möchte ich mit einer Assemblerroutine die 24-Bit RGB-Werte auslesen. Da meine Anwendung sehr zeitkritisch ist, kann ich hier nicht die GDI-Funktion GetPixel() benutzen. Ein Codeschnippsel unter Anwendung des Objektzeiger wäre ideal.
Danke im voraus...
MacReeg
-
Vielleicht habe ich mich ein bisschen zu vage ausgedrückt. Folgendes Szenario:
Ich hole mich mit folgenden Source ein Bild von der WebCam.
void CCam::InitCam(HWND Handle) { ParentHandle = Handle; hwndVideo = capCreateCaptureWindow("My Web Cam", WS_CHILD | WS_VISIBLE, 0, 0, 400, 300, Handle, 1); }
hwndVideo ist vom Typ HWND. Der Ausruf dieser Funktion geht folgend:
myCam->InitCam(m_PicLive);
m_PicLive ist eine Membervariable vom Grafikobject Picture das ich auf meine Form gezogen habe. Er stellt das laufende WebCam-Bild auch in dem Picture-Objekt dar. Nun möchte ich, dass durch die Analyse zweier zeitversetzter WebCam-Bilder der Rechner mir das bewegende Objekt im Bild mit einem Kreuz versieht. Dies habe ich in C++ schon realisiert und läuft auf meinem 2 GHz Rechner auch ganz gut. Siehe Link:
http://mitglied.lycos.de/macreeg/webcam.bmp
Wenn ich aber mein WebCam-Bild auflösungsmäßig vergrößern will, dann geht der C++-Code böse in die Knie. Um dies abzufangen wollte ich nun die RGB-Werte (Farbwerte pro Pixel) in Maschinensprache auslesen. Dazu wollte ich eigentlich den hwndVideo-Handle benutzen - will aber nicht so. Folgend der C++-Code des Auslesens eines WebCam-Bildes:
for (int y = 0; y <= 143; y++) { for (int x = 0; x <= 175; x ++) { ColPic1 = dcPic1->GetPixel(x, y); int Color1 = ((byte)ColPic1 + (byte)(ColPic1 >> 8) + (byte)(ColPic1 >> 16)) / 3; ColPic2 = dcPic2->GetPixel(x, y); int Color2 = ((byte)ColPic2 + (byte)(ColPic2 >> 8) + (byte)(ColPic2 >> 16)) / 3; if ((Color1 < Color2 - Toleranz) || (Color1 > Color2 + Toleranz)) { CPen lSolidPenRot(PS_SOLID,1,RGB(255, 0, 0)); dcPic2->SelectObject(&lSolidPenRot); dcPic2->MoveTo(x, 0); dcPic2->LineTo(x, 300); dcPic2->MoveTo(0, y); dcPic2->LineTo(400, y); x = 200; y = 200; } } }
Vielleicht hat ja irgendjemand eine Idee wie und welchen Handle ich zum Auslesen benutzen kann. Ein kleiner Codeschnippsel wäre nicht schlecht.
Gruß MacReeg
-
Assembler wird dir hier nicht weiterhelfen, da du von einem Handle unmöglich auf die Pixel schließen kannst.
Achtung: Auch in Assembler hast du nicht mehr Möglichkeiten auf den Speicher oder auf Geräte zuzugreifen als in C++, solange dein Programm unter Windows läuft.Dein Problem hat eher mit WinAPI zu tun. Das Pixelformat ist geräteabhängig, deswegen kriegst du die Pixel nicht. In der WinAPI gibt es die Funktion GetDIBits. Damit bekommst du die Pixel in einem geräteunabhängigen Format, das deine Anwendung verarbeiten kann.
Such mal im WinAPI-Forum. Oder im MFC-Forum, da du wohl nach eine MFC-Lösung suchst.
Assembler ist in jedem Fall fehl am Platze. Das kannst du vielleicht ganz am Ende, als allerletzten Optimierungsschritt, einsetzen.