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
Lesezeichen