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
Lesezeichen