int main( int /* argc */, char** /* argv */ ) { TriclopsContext context; TriclopsImage depthImage; TriclopsInput inputData; TriclopsError error; // get the camera module configuration error = triclopsGetDefaultContextFromFile( &context, "config" ); _HANDLE_TRICLOPS_ERROR( "triclopsGetDefaultContextFromFile()", error ); if ( error != TriclopsErrorOk ) { printf( "Can't open calibration file 'config'\n" ); exit( 1 ); } // Load images from file TriclopsBool bErr = ppmReadToTriclopsInput( "input.ppm", &inputData ); if( !bErr ) { printf( "ppmReadToTriclopsInput() failed. Can't find input.ppm?\n" ); exit( 1 ); } // set up some stereo parameters: // set to 320x240 output images error = triclopsSetResolution( context, 240, 320 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetResolution()", error ); // set disparity range error = triclopsSetDisparity( context, 5, 60 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetDisparity()", error ); // set the display mapping // note: disparity mapping corrupts the disparity values so that making // distance measurements is more difficult and less accurate. // Do not use it when you intend to actually use disparity values for // purposes other than display error = triclopsSetDisparityMapping( context, 128, 255 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetDisparityMapping()", error ); error = triclopsSetDisparityMappingOn( context, 1 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetDisparityMappingOn()", error ); // set the validation mappings to 0 (black) error = triclopsSetUniquenessValidationMapping( context, 0 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetUniquenessValidationMapping()", error ); error = triclopsSetTextureValidationMapping( context, 0 ); _HANDLE_TRICLOPS_ERROR( "triclopsSetTextureValidationMapping()", error ); // Preprocessing the images error = triclopsPreprocess( context, &inputData ); _HANDLE_TRICLOPS_ERROR( "triclopsPreprocess()", error ); // stereo processing error = triclopsStereo( context ); _HANDLE_TRICLOPS_ERROR( "triclopsStereo()", error ); // retrieve the depth image from the context error = triclopsGetImage( context, TriImg_DISPARITY, TriCam_REFERENCE, &depthImage ); _HANDLE_TRICLOPS_ERROR( "triclopsGetImage()", error ); // save the depth image error = triclopsSaveImage( &depthImage, "depth.pgm" ); _HANDLE_TRICLOPS_ERROR( "triclopsSaveImage()", error ); // clean up memory allocated in context freeInput( &inputData ); error = triclopsDestroyContext( context ); return 0; }
stereoCam::stereoCam() { // Find cameras on the 1394 buses d = dc1394_new (); // Enumerate cameras connected to the PC err = dc1394_camera_enumerate (d, &list); if ( err != DC1394_SUCCESS ) { fprintf( stderr, "Unable to look for cameras\n\n" "Please check \n" " - if the kernel modules `ieee1394',`raw1394' and `ohci1394' " "are loaded \n" " - if you have read/write access to /dev/raw1394\n\n"); nThisCam=-1; //return 1; } if (list->num == 0) { fprintf( stderr, "No cameras found!\n"); nThisCam=-1; //return 1; } printf( "There were %d camera(s) found attached to your PC\n", list->num ); // Identify cameras. Use the first stereo camera that is found for ( nThisCam = 0; nThisCam < list->num; nThisCam++ ) { camera = dc1394_camera_new(d, list->ids[nThisCam].guid); if(!camera) { printf("Failed to initialize camera with guid %llx", list->ids[nThisCam].guid); continue; } printf( "Camera %d model = '%s'\n", nThisCam, camera->model ); if ( isStereoCamera(camera)) { printf( "Using this camera\n" ); break; } dc1394_camera_free(camera); } if ( nThisCam == list->num ) { printf( "No stereo cameras were detected\n" ); nThisCam=-1; //return 0; } // Free memory used by the camera list dc1394_camera_free_list (list); // query information about this stereo camera err = queryStereoCamera( camera, &stereoCamera ); if ( err != DC1394_SUCCESS ) { fprintf( stderr, "Cannot query all information from camera\n" ); cleanup_and_exit( camera ); } if ( stereoCamera.nBytesPerPixel != 2 ) { // can't handle XB3 3 bytes per pixel fprintf( stderr, "Example not updated to work with XB3 in 3 camera mode yet!\n" ); cleanup_and_exit( stereoCamera.camera ); } // set the capture mode printf( "Setting stereo video capture mode\n" ); err = setStereoVideoCapture( &stereoCamera ); if ( err != DC1394_SUCCESS ) { fprintf( stderr, "Could not set up video capture mode\n" ); cleanup_and_exit( stereoCamera.camera ); } // have the camera start sending us data printf( "Start transmission\n" ); err = startTransmission( &stereoCamera ); if ( err != DC1394_SUCCESS ) { fprintf( stderr, "Unable to start camera iso transmission\n" ); cleanup_and_exit( stereoCamera.camera ); } // give the auto-gain algorithms a chance to catch up // printf( "Giving auto-gain algorithm a chance to stabilize\n" ); // sleep( 5 ); // Allocate all the buffers. // Unfortunately color processing is a bit inefficient // because of the number of // data copies. Color data needs to be // - de-interleaved into separate bayer tile images // - color processed into RGB images // - de-interleaved to extract the green channel // for stereo (or other mono conversion) // size of buffer for all images at mono8 nBufferSize = stereoCamera.nRows * stereoCamera.nCols * stereoCamera.nBytesPerPixel; // allocate a buffer to hold the de-interleaved images pucDeInterlacedBuffer = new unsigned char[ nBufferSize ]; pucRGBBuffer = new unsigned char[ 3 * nBufferSize ]; pucGreenBuffer = new unsigned char[ nBufferSize ]; // do stereo processing printf( "Getting TriclopsContext from camera (slowly)... \n" ); e = getTriclopsContextFromCamera( &stereoCamera, &triclops ); TRIERR(e); printf( "...got it\n" ); // make sure we are in subpixel mode e = triclopsSetSubpixelInterpolation( triclops, 1 ); TRIERR(e); e = triclopsSetDisparityMapping(triclops,0,60); TRIERR(e); e = triclopsSetDisparityMappingOn(triclops,1); TRIERR(e); e = triclopsSetUniquenessValidationMapping(triclops,0); TRIERR(e); e = triclopsSetTextureValidationMapping(triclops,0); TRIERR(e); isInRoutine=false; }