auf dem bild meiner webcam rummalen



  • mojn.
    ich hab ein fenster in dem das aktuelle bild meiner webcam dargestellt wird.
    jetzt würd ich aber noch ganz gern auf diesem bild rum malen und werte von dem bild nehmen wie z.b. die farbe von bestimmten pixeln usw.
    leider geht das ganze anscheinend nicht mit GDI oder ewa doch?
    vieleicht kennt jemand ja die lösung.

    benutze folgenden code:

    #include <windows.h>
    #include <vfw.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         char          szAppName[] = "Name" ;
         HWND        hwnd ;
         MSG         msg ;
         WNDCLASS  wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         RegisterClass (&wndclass) ;
    
         hwnd = CreateWindow (szAppName, "Fenstername",  WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
                              0, 0, 500, 500,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
              {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
              }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HINSTANCE hInstance;
    	static HWND hwndVideo;
    	static HDC hdc;
    	static PAINTSTRUCT ps;
    	static HPEN hPen;
    	static LPRECT lp;
    
         switch (iMsg)
              {
              case WM_CREATE :
    			   hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
    			   hwndVideo = capCreateCaptureWindow((LPSTR)"WebCam",
    				   WS_CHILD| WS_VISIBLE | WS_MAXIMIZE,
    				   0, 0, CW_USEDEFAULT, CW_USEDEFAULT,(HWND) hwnd, (int) 3);
    			   if(!capDriverConnect(hwndVideo,0))
    			   {
    				   MessageBox(hwnd,"Treiber konnte nicht geladen werden!","Treiberfehler",MB_ICONERROR);
    				   SendMessage(hwnd,WM_DESTROY,0,0);
    				   return 0;
    			   }
    			   capPreviewRate(hwndVideo,15);
    			   capPreview(hwndVideo,TRUE);
                   return 0 ;
    
    		  case WM_PAINT:	   
    			   hdc = BeginPaint(hwnd, &ps);
    			   TextOut(hdc,30,30,"Dummytext",9);
    			   EndPaint(hwnd, &ps);
    			   return 0;
    
              case WM_DESTROY:
    			   capPreview(hwndVideo,FALSE);
    			   capDriverDisconnect(hwndVideo);
                   PostQuitMessage (0) ;
                   return 0 ;
              }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    


  • Wenn du "Dummytext" schreiben willst, solltest du in das Videofenster zeichnen und nicht in das Parent-Window...



  • wenn ich versuche in das child zu malen dann hab ich kein bild mehr von der webcam.

    case WM_PAINT:
    hdc = BeginPaint(hwndVideo, &ps);
    TextOut(hdc,30,30,"Dummytext",9);
    EndPaint(hwndVideo, &ps);
    return 0;
    

    oder gibt es eine möglichkeit an soetwas wie ne callback-funktion von capcreatecapturewindow zu kommen und den code dann dort rein zu schreiben?



  • ich hab jetzt was interessantes herausgefunden.
    es ist nicht möglich mit gdi auf frames zu malen oder diese mit gdi auszuwerten.
    der grund:
    gdi is zu langsam.
    frgat mich net warum aber es scheint einfach so zu sein.
    ich hab jetzt folgenden code mit dem ich nen text zwar mittels gdi aufs bild der cam malen kann aber das flimmern ist ziemlich stark und weiterhin hab ich immer noch keine möglichkeit die frames auszuwerten.

    #include <windows.h>
    #include <vfw.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         char          szAppName[] = "Name" ;
         HWND        hwnd ;
         MSG         msg ;
         WNDCLASS  wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         RegisterClass (&wndclass) ;
    
         hwnd = CreateWindow (szAppName, "Fenstername",  WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
                              0, 0, 500, 500,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
              {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
              }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HINSTANCE hInstance;
    	static HWND hwndVideo;
    	static HDC hdc;
    	static PAINTSTRUCT ps;
    	static HPEN hPen;
    
         switch (iMsg)
              {
              case WM_CREATE :
    			   hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
    			   hwndVideo = capCreateCaptureWindow((LPSTR)"WebCam",
    				   WS_CHILD| WS_VISIBLE | WS_MAXIMIZE,
    				   0, 0, CW_USEDEFAULT, CW_USEDEFAULT,(HWND) hwnd, (int) 3);
    			   if(!capDriverConnect(hwndVideo,0))
    			   {
    				   MessageBox(hwnd,"Treiber konnte nicht geladen werden!","Treiberfehler",MB_ICONERROR);
    				   SendMessage(hwnd,WM_DESTROY,0,0);
    				   return 0;
    			   }
    			   capPreviewRate(hwndVideo,10);
    			   capPreview(hwndVideo,TRUE);
    			   capSetCallbackOnFrame(hwndVideo,FrameCallbackProc);
                   return 0 ;
    
    		  /*case WM_PAINT:
    
    			   return 0;*/
    
              case WM_DESTROY:
    			   capPreview(hwndVideo,FALSE);
    			   capDriverDisconnect(hwndVideo);
                   PostQuitMessage (0) ;
                   return 0 ;
              }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    int a=0;
    
    LRESULT CALLBACK FrameCallbackProc(HWND hwnd, LPVIDEOHDR lpVHdr)
    {
    	static HDC hdc;
    	hdc = CreateDC("DISPLAY", (LPCSTR) NULL,(LPCSTR) NULL, (CONST DEVMODE *) NULL);
    	TextOut(hdc,300,300,"Dummytext",9);
    	DeleteDC(hdc);
    	return TRUE;
    }
    

    hat einer ne idee wie ich die frames auswerten kann?
    ich will das mein rechner farben erkennt, sprich ich halte ein blatt mit ner farbe vor die cam und der rechner soll mir die farbe nennen.
    später soll er dann konturen erkennen und nachzeichnen.

    geht das alles vieleicht mit directdraw???
    habe fragen über fragen hoffe das stört keinen 🙄



  • Hallo!

    Also das mit den Konturen erkennen wird sich wahrscheinlich als Problematisch erweisen. Eine einfache Kantendetektion wird shcon möglich sein, aber komplexe Strukturen sind wohl nicht in Echtzeit möglich (25-30 Frames per Second).
    Die Farbe ist einfach per Median zu berechnen.

    --> Insgesamt bleibt aber das Echtzeitproblem. Der PC braucht viel Rechenkapazität.



  • Hallo,

    Ich krame dieses Thema mal wieder aus, da ich im Grunde genommen ein ähnliches Problem habe.
    Wie mein Vorredner auch, habe ich das Bild meiner Cam mittels vfw.h in meine Applikation eingebunden. Nun möchte ich ein einfaches Fadenkreuz über das Kamerabild legen. Das Fadenkreuz muss nicht geändert werden und soll von Anfang bis Ende über dem Kamerabild bleiben.

    Was gibt es dafür für Möglichkeiten? (Stichworte reichen)
    (habe über die Suche leider nichts passendes gefunden)

    mfG

    Johannes


  • Mod

    Durchsichtiges Fenster drüber legen und darauf malen.



  • Ein neues Fenster hab ich schon versucht drüber zu legen, aber das wird immer wieder von dem Kamerabild überzeichnet

    edit: hab jetzt mal versucht ein Layered Window mit WS_EX_LAYERED zu erzeugen (siehe: http://msdn.microsoft.com/en-us/library/ms997507.aspx#layerwin_topic3), aber dann bekomm ich immer den Fehler "WS_EX_LAYERED" nichtdeklarierter Bezeichner. Was fehlt mir denn hier?


Anmelden zum Antworten