Pixelvergleiche // Abweichungen berechnen aber wie ?



  • @ 1 : kann die sonst dafür notwendigen grundsachen schon , java eclipse // anfänge c++ kann ich ja , nur die farbwerte von dem aktuellen bild zu kriegen kriegen wir nicht hin .

    @ 2 : immo kann er auf knopfdruck akitivert werden und spult dann halt ein Tastaturanschlag // mausbewegung programm ab ... die differenzierung was genau er tun soll müsste halt mit bildvergleichen erfolgen .
    Geschrieben ist er in dem Editor "SciTe"(Autoit3)



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Kommt schon ihgrendwer wird doch dazu was wissen 😞 wir sind am verzweifeln



  • eikim schrieb:

    Kommt schon ihgrendwer wird doch dazu was wissen 😞 wir sind am verzweifeln

    Schon klar... ich glaube aber nicht, dass viele eine Idee davon haben, was du genau willst. Ich jedenfalls nicht.
    Farbdifferenzen rechnest du aus indem du die Differenzen von den RGB-Werten zusammenzählst. Je nachdem, wo sich deine Pixel befinden, kannst du evtl. GetPixel() zum Auslesen verwenden.



  • es geht letzen endes um eine einfache if abfrage ..
    if ( abweichung zwischen gespeichertem farbwert und aktuellem farbwert > x )
    {....}
    else {...}

    a) wie komme ich an die farbwerte eines pixels ? (z.b. 255.255.255 )
    b) wie komme ich an die aktuellen Farbwerte des gleichen pixels ran ?



  • eikim schrieb:

    a) wie komme ich an die farbwerte eines pixels ? (z.b. 255.255.255 )

    COLORREF cref;
    int r, g, b;
    
    cref = GetPixel(
      HDC hdc,    // handle to DC
      int nXPos,  // x-coordinate of pixel
      int nYPos   // y-coordinate of pixel
    );
    
    r = GetRValue(cref);
    g = GetGValue(cref);
    b = GetBValue(cref);
    

    eikim schrieb:

    b) wie komme ich an die aktuellen Farbwerte des gleichen pixels ran ?

    Genauso wie zuvor!

    Am besten Dokumentation zum SDK nach SetPixel, GetPixel, Bitmap, GetDC durchsuchen, sind manchmal Beispiele bei. Viel Erfolg!



  • eikim schrieb:

    Kommt schon ihgrendwer wird doch dazu was wissen 😞 wir sind am verzweifeln

    Doch wissen wir. Und wie du, weiter unten, festgestellt hast. Ist es nichts anderes als eine "einfache" if-Abfrage. Nur ist das Problem wie kommt man an die Farbwerte.

    Dazu gibt es mehrere Möglichkeiten. Die WinAPI kann euch sicher helfen, wenn es für Windows ist.

    Ich kann dir mal ein Beispiel zeigen wie einfach es gehen kann. Der Code ist wiklich auf die schnelle entstanden und erhebt keinen Anspruch auf Vollständigkeit. Aber er funktioniert. 😃

    Screenshot

    #include"gidx.h"
    
    LPIMAGE	gesicht1;
    LPIMAGE gesicht2;
    LPIMAGE unterschied;
    
    unsigned long quelle[89][70];
    unsigned long ziel[89][70];
    
    int main()
    {
    	graphic(640,480,16,GXDEBUG);
    
    	loadimage("gfx/gesicht1.bmp",&gesicht1,GXVIDEOMEMORY);
    	loadimage("gfx/gesicht2.bmp",&gesicht2,GXVIDEOMEMORY);
    	createimage(&unterschied,89,70,GXVIDEOMEMORY);
    
    	// Fraben beider Gesichter im Array speichern
    	lockbuffer(gesicht1);
    	for(int i=0; i<89; i++)
    	{
    		for(int j=0; j<70; j++)
    		{	
    			quelle[i][j] = getpixel(i,j);
    		}
    	}
    	unlockbuffer(gesicht1);
    
    	// Hier das zweite Gesicht
    	lockbuffer(gesicht2);
    	for(int i=0; i<89; i++)
    	{
    		for(int j=0; j<70; j++)
    		{	
    			ziel[i][j] = getpixel(i,j);
    		}
    	}
    	unlockbuffer(gesicht2);
    
    	// Speicherbereich locken um reinzuschreiben
    	lockbuffer(unterschied);
    	for(int i=0; i<89; i++)
    	{
    		for(int j=0; j<70; j++)
    		{	
    			if(ziel[i][j] != quelle[i][j])
    			{
    				// Bei Unterschied mit rot 
    				color(255,0,0);				
    			}
    			else
    			{
    				// Wenn kein Unteschied grün
    				color(0,255,0);
    			}
    
    			setpixel(i,j);
    		}
    	}
    	unlockbuffer(unterschied);
    
    	color(0,0,0);
    	cls();
    
    	drawimage(5,5,gesicht1,0);
    	drawimage(99,5,gesicht2,0);
    	drawimage(193,5,unterschied,0);
    
    	flip(0);
    
    	waitkey();
    
    	return(GXRETURN);
    }
    

    Ich verwende dafür die giDX² 2D Engine. Diese basiert auf DirectX7 und ist für VisualC++ (ab Version 5.0). Hier kann man sie runterladen. http://home.arcor.de/3dkult/

    Die neuste Version ist noch nicht freigegeben. Wer interesse an der letzten Version hat kann sich ja melden.



  • vielen dank für die antworten , der letzte beitrag ließe sich soweit umsetzen nur die frage zu "loadimage("gfx/gesicht2.bmp",&gesicht2,GXVIDEOMEMORY);" , um es so zu machen müsste ich ja immer einen sceenshot machen um ihn zu vergleichen , wie kann man sagen das man einfach den aktuellen bildschirminhalt vergleichen möchte ?



  • Wie willst du die Bilder in den Speicher bekommen. Mit einer Cam? Kannst du das genauer beschreiben.



  • Nein , ich will einen screenshot mit dem aktuellen Bildschirm vergleichen , dannach kann sich der bot dann quasi "orientieren" .

    Bsp.
    Bot befindet sich an Punkt a und läuft los , ein Screenshot ( muss nicht der ganze bildschirm sein , eher ein farblich charakteristischer ausschnitt ) wird mit dem aktuellen Bildschirm verglichen ( beispielsweise ein screenshot vom boden der grau ist ) sobald sich starke abweichungen auftreten ( wenn er z.b. vor einem hindernis steht ) geht er in eine andere schleife in der definiert wird wie er auf Hindernisse zu reagieren hat usw.

    Ist Schwer zu erklären 😉 hoffe es wurde ein bisschen veranschaulicht

    Probleme :
    a) wie vergleiche ich mit dem aktuellen bildschirm bzw. wie kriege ich die aktuellen farbwerte ?
    b) wenn ich einen ausschnitt vergleichen will muss ich ja zwangsläufig koordinaten angeben , gibts ein programm das mir die anzeigt ?


Anmelden zum Antworten