- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: OpenCV

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    Anzeige

    Powerstation Test
    Zitat Zitat von K.Hartmann
    Anschließend läuft es in einer Schleife und erzeugt mit geschätzen 15 FPS die Disparity-Maps.
    NAJA, also für 15fps brauchst du schon eine starke Maschine (für einen Roboter).
    Ich habe bei Block-Matching (wie es in deinem Code ist) je nach Einstellung auf meinem 1.83Ghz Dualcore ca 10fps erhalten.
    Der andere Algorithmus der in OpenCV implementiert ist (Graph-Cut), benötigt noch um ein Hauseck mehr CPU-Zeit.

    Aber lass dich davon nicht demotivieren.

    LG

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2010
    Alter
    64
    Beiträge
    8
    Bin wieder im Land. Gestern hatte ich noch einen Zahnarzttermin, der mich etwas gebügelt hat, so das ich mich erst jetzt wieder melde.
    Ich habe da so ein kleines "Snapshot"-Progrämmchen zusammen gestümpert.
    Dieses Programm zeigt Dir die life-Bilder der beiden Kameras an. Und bei jedem Druck auf die Leertaste speichert es die beiden Bilder als Graustufen jpg ab. Soweit, so gut. Nur haben die entstehenden Dateien etwa die doppelte Größe der Bilddateien aus der Demo. Es liegt also nahe zu vermuten, das schon meine Bilder falsch sind. Versuche mit der Funktion cvResize führten lediglich zu Fehlermeldungen bei der Programmausführung. Am besten poste ich mal meinen kleinen mistigen Quellcode des Snapshotprogramms.
    Code:
    #include <stdio.h>
    #include <string>
    #include <sstream>
    #include <highgui.h>
    
    #include <stdlib.h>
    #include <cv.h>
    #include <cvaux.h>
    #include <math.h>
    
    using namespace std;
    
    int main(int argc, char ** argv)
    {
    	int n = 1;
    	char buffer[1024];
    
    	CvCapture* rightCapture = cvCaptureFromCAM(1);
    	if( !rightCapture ) {
    		fprintf( stderr, "ERROR: rightCapture is NULL \n" );
    		getchar();
    		return -1;
    	}
    
    	CvCapture* leftCapture = cvCaptureFromCAM(0);
    	if( !leftCapture ) {
    		fprintf( stderr, "ERROR: leftCapture is NULL \n" );
    		getchar();
    		return -1;
    	}
    
    	// Create a window in which the captured images will be presented
    	cvNamedWindow( "rightCamWindow", CV_WINDOW_AUTOSIZE );
    	cvNamedWindow( "leftCamWindow", CV_WINDOW_AUTOSIZE );
    	cvMoveWindow("rightCamWindow",0,0);
    	cvMoveWindow("leftCamWindow",650,0);
    
    	// Show the image captured from the camera in the window and repeat
    	while( n<15 ) {
    		// Get one frame
    		IplImage* rightFrame = cvQueryFrame( rightCapture );
    		IplImage* leftFrame = cvQueryFrame( leftCapture );
    		if( !rightFrame ) {
    			fprintf( stderr, "ERROR: rightFrame is null...\n" );
    			getchar();
    			break;
    		}
    
    		if( !leftFrame ) {
    			fprintf( stderr, "ERROR: leftFrame is null...\n" );
    			getchar();
    			break;
    		}
    
    		cvShowImage( "rightCamWindow", rightFrame );
    		// Do not release the frame!
    		cvShowImage( "leftCamWindow", leftFrame );
    		// Do not release the frame!
    
    		int cc = 0;
    		while(cc==0){
    			if( (cvWaitKey(10) & 255) == 32 ){
    				cc = 1;
    				cvShowImage( "rightCamWindow", rightFrame );
    				// Do not release the frame!
    				cvShowImage( "leftCamWindow", leftFrame );
    				// Do not release the frame!
    			}
    			IplImage* rightFrame = cvQueryFrame( rightCapture );
    			if( !rightFrame ) {
    				fprintf( stderr, "ERROR: rightFrame is null...\n" );
    				getchar();
    				break;
    			}
    			IplImage* leftFrame = cvQueryFrame( leftCapture );
    			if( !leftFrame ) {
    				fprintf( stderr, "ERROR: leftFrame is null...\n" );
    				getchar();
    				break;
    			}
    			cvShowImage( "rightCamWindow", rightFrame );
    			// Do not release the frame!
    			cvShowImage( "leftCamWindow", leftFrame );
    			// Do not release the frame!
    		}
    		ostringstream outStream;
    		outStream << n;
    		string sn = outStream.str();
    		string s0 = "1";
    		string s1 = "/home/xyz/workspace/stereo-3d/r";
    		string s2 = "/home/xyz/workspace/stereo-3d/l";
    		if(n<10) {
    			s1 = "/home/xyz/workspace/stereo-3d/r0";
    			s2 = "/home/xyz/workspace/stereo-3d/l0";
    		}
    		int l;
    
    		if(rightFrame) {
    			s0 = s1 + outStream.str();;
    			s0 += ".jpg#";
    			for (int i=0;i<=100; i++)
    			{
    				if (s0[i] != '#') {
    					buffer[i] = s0[i];
    					buffer[i+1] = '\0';
    				}
    				else break;
    			}
    			IplImage* tmpImgGray = cvCreateImage(cvGetSize(rightFrame), IPL_DEPTH_8U,1);
    			cvCvtColor(rightFrame, tmpImgGray ,CV_RGB2GRAY );
     			cvSaveImage(buffer ,tmpImgGray);
    			cvReleaseImage(&tmpImgGray);
    		}
    		if(leftFrame) {
    			s0 = s2 + outStream.str();;
    			s0 += ".jpg#";
    			for (int i=0;i<=100; i++)
    			{
    				if (s0[i] != '#') {
    					buffer[i] = s0[i];
    					buffer[i+1] = '\0';
    				}
    				else break;
    			}
    			IplImage* tmpImgGray = cvCreateImage(cvGetSize(leftFrame), IPL_DEPTH_8U,1);
    			cvCvtColor(leftFrame, tmpImgGray ,CV_RGB2GRAY );
    			cvSaveImage(buffer ,tmpImgGray);
    			cvReleaseImage(&tmpImgGray);
    		}
    		//If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
    		//remove higher bits using AND operator
    		if( (cvWaitKey(10) & 255) == 27 ) break;
    		n++;
    	}
    
    	// Release the capture device housekeeping
    	cvReleaseCapture( &rightCapture );
    	cvDestroyWindow( "rightCamWindow" );
    	cvReleaseCapture( &leftCapture );
    	cvDestroyWindow( "leftCamWindow" );
    	return 0;
    }
    Nicht verzweifeln! Ich habe seit fast 20 Jahren nichts mehr mit C gemacht. Man mag mir also mein Unvermögen verzeihen.

    Klaus

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    Kannst du deine Bilder öffnen? Sehen sie dann richtig aus? Wenn ja, dann kannst du höchstens noch an der Kompression schrauben (müsste aber selber nachsehen wie).
    Ansonsten kann es sein das du einfach größere Bilder hast (Auflösungsmäßig).
    Was mir sonst noch aufgefallen ist:
    Code:
    for (int i=0;i<=100; i++) 
    { 
         if (s0[i] != '#') { 
            buffer[i] = s0[i]; 
            buffer[i+1] = '\0'; 
         } 
         else break; 
    }
    Das ist höflich ausgedrückt "suboptimal"
    die "string"-Klasse hat eine funktion namens "c_str()" mit der das erledigt wird. (dann kannst du dir auch dein End-Zeichen sparen)

    Ach ja und was mir noch aufgefallen ist: Du hast sowohl rightFrame als auch leftFrame 2x definiert (zeile 41 und 69). Und du fragst pro Schleifendurchlauf je 2 Frames ab (ich denke nicht, dass das Absicht ist). Und warum lasst du deine Schleife nur 15mal durchlaufen??

    LG

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2010
    Alter
    64
    Beiträge
    8
    Das war ja wohl ne Lachnummer.
    Also. Ich habe zunächst mal den Code von quick 'n dirty auf etwas verfeinert umgeschrieben.
    Code:
    #include <stdio.h>
    #include <string>
    #include <sstream>
    #include <highgui.h>
    
    #include <stdlib.h>
    #include <cv.h>
    #include <cvaux.h>
    #include <math.h>
    
    using namespace std;
    
    int main(int argc, char ** argv)
    {
    	int n = 1;
    	char buffer[1024];
    	IplImage* rightFrame;
    	IplImage* leftFrame;
    	CvCapture* rightCapture = cvCaptureFromCAM(1);
    	CvCapture* leftCapture = cvCaptureFromCAM(0);
    
    	// Create a window in which the captured images will be presented
    	cvNamedWindow( "rightCamWindow", CV_WINDOW_AUTOSIZE );
    	cvNamedWindow( "leftCamWindow", CV_WINDOW_AUTOSIZE );
    	cvNamedWindow( "rightCaptureWindow", CV_WINDOW_AUTOSIZE );
    	cvNamedWindow( "leftCaptureWindow", CV_WINDOW_AUTOSIZE );
    	cvMoveWindow("rightCamWindow",0,0);
    	cvMoveWindow("leftCamWindow",650,0);
    	cvMoveWindow("rightCaptureWindow",0,490);
    	cvMoveWindow("leftCaptureWindow",650,490);
    
    	// Show the image captured from the camera in the window and repeat
    	while( n<15 ) {
    		rightFrame = cvQueryFrame( rightCapture );
    		leftFrame = cvQueryFrame( leftCapture );
    
    		cvShowImage( "rightCamWindow", rightFrame );
    		cvShowImage( "leftCamWindow", leftFrame );
    
    		if( (cvWaitKey(10) & 255) == 32 ){
    			ostringstream outStream;
    			outStream << n;
    			string sn = outStream.str();
    			string s0 = "1";
    			string s1 = "/home/klaus/workspace/stereo-3d/r";
    			string s2 = "/home/klaus/workspace/stereo-3d/l";
    			if(n<10) {
    				s1 = "/home/klaus/workspace/stereo-3d/r0";
    				s2 = "/home/klaus/workspace/stereo-3d/l0";
    			}
    
    			s0 = s1 + outStream.str();;
    			s0 += ".jpg";
    			strcpy (buffer,s0.c_str());
    			IplImage* rightImgGray = cvCreateImage(cvGetSize(rightFrame), IPL_DEPTH_8U,1);			
    			cvCvtColor(rightFrame, rightImgGray ,CV_RGB2GRAY );
    			cvShowImage( "rightCaptureWindow", rightImgGray );
     			cvSaveImage(buffer ,rightImgGray);
    			cvReleaseImage(&rightImgGray);
    			
    			s0 = s2 + outStream.str();;
    			s0 += ".jpg";
    			strcpy (buffer,s0.c_str());
    			IplImage* leftImgGray = cvCreateImage(cvGetSize(leftFrame), IPL_DEPTH_8U,1);
    			cvCvtColor(leftFrame, leftImgGray ,CV_RGB2GRAY );
    			cvShowImage( "leftCaptureWindow", leftImgGray );
    			cvSaveImage(buffer ,leftImgGray);
    			cvReleaseImage(&leftImgGray);
    			n++;
    		}
    		rightFrame = cvQueryFrame( rightCapture );
    		leftFrame = cvQueryFrame( leftCapture );
    		//If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
    		//remove higher bits using AND operator
    		if( (cvWaitKey(10) & 255) == 27 ) break;
    	}
    	// Release the capture device housekeeping
    	cvReleaseCapture( &rightCapture );
    	cvReleaseCapture( &leftCapture );
    	cvDestroyWindow( "rightCamWindow" );
    	cvDestroyWindow( "leftCamWindow" );
    	cvDestroyWindow( "rightCaptureWindow" );
    	cvDestroyWindow( "leftCaptureWindow" );
    	cvReleaseImage(&rightFrame);
    	cvReleaseImage(&leftFrame);
    
    	return 0;
    }
    Das mag zwar immer noch besser gehen, aber für jemanden, der C irgendwann vor über 20 Jahren mal kurz angeschaut hat und plötzlich mit CPP rumkaspert, geht der neue Code doch wohl?
    Aber trotzdem ging rein garnix. Dann ist mir aber die Idee gekommen, mir die Datei stereo_calib.txt noch mal genau anzuschauen. Echt bescheuert.
    Ich habe ein 9 * 7 Schachbrett. Aus irgendwelchen unerfindlichen Gründen muss ich in die erste Zeile der Textdatei also 8 6 eintragen. Immer eins weniger. Ok. Ich dachte das hätte ich so gemacht. Tatsächlich stand da aber 9 6.
    Kaum hatte ich das geändert, lief alles, wie es soll.
    Zusammenfassend kann man sagen:

    1. Das verwendete "Schachbrett" DARF NICHT quadratisch sein. Es muss in den beiden Richtungen UNGLEICH viele quadratische Felder aufweisen.

    2. Die Bilder MÜSSEN als Graustufenbilder gespeichert sein.

    3. In der Textdatei MUSS die um jeweils 1 verminderte Anzahl von Feldern in Länge und Breite des Schachbretts eingetragen sein.

    4. Es wird empfohlen mindestens 15 Bilderpaare zu erstellen, um eine brauchbare Kalibrierung zu erhalten.

    So. Jetzt klappt es jedenfalls und ich kann mich daran machen den RS232 / i2s Adapter zusammen zu braten.

    Vielen Dank

    Klaus

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    Dann wünsch ich dir noch viel Glück.

    Ich will ja nicht i-Tüpfelreiter spielen, aber das mit "c_str()" hatte ich eigentlich so gemeint:
    Code:
    ...
    s0 += ".jpg"; 
    //strcpy (buffer,s0.c_str()); //braucht keiner ;)
    ...       
    cvSaveImage(s0.c_str() ,rightImgGray);
    Dann sparst du dir zumindest 1kB Ram

    LG
    Nothing is impossible, the impossible just takes longer!

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad