2

それとも、バンブルビー(またはその他のポイントグレイイメージングセンサー)に完全に依存していますか?いくつかのオフライン画像を処理するために、bumblebee2ステレオリグに付属しているステレオ処理APIをリンクしようとしています。triclopsステレオ関数には、input.calおよびinput.ppmの形式のコンテキストフラグとキャリブレーションファイルが必要なようです(つまり、2つのステレオ補正画像を含む1つの画像が、ぼやけてオーバーレイされています)。他のオフライン画像からこのinput.ppmファイルを取得して、triclopsステレオAPIを引き続き使用できるようにするにはどうすればよいですか。そして、キャリブレーションファイルinput.calはどうですか、オフライン画像と一致するように取得できますか?

4

1 に答える 1

2

はい、Triclops API を使用してオフライン画像を処理できます。ご指摘の要件は、カメラと画像ファイルからのキャリブレーション ファイル (.cal) です。キャリブレーション ファイルは、画像のキャプチャ時に抽出するのが最適ですが、私の経験では、設定を変更しない限り、常に同じままです。Triclops API の入力を満たすには、画像変換のメソッドを提供する Point Gray Fly Capture API も使用する必要があります。私のプロジェクトは、あなたが求めていることをすべて正確に実行しています。フィールドで未加工のピクセル インターリーブ画像をキャプチャし、後で FlyCapture API と Triclops API を使用してそれらを処理し、ステレオ ペアから修正画像と視差画像、および点群を作成します。

キャリブレーション ファイルをキャプチャする方法については、Point Gray のサンプルとその API ドキュメントを確認してください。基本的に方法は次のとおりです。flycaptureGetCalibrationFileFromCamera( context, &szCalFile ); コンテキストが「カメラコンテキスト」である場合

最初の画像ファイル形式によって変換方法が異なりますが、私の場合は、C++ を使用して raw からステレオに変換した方法を次に示します。サイズが 1280x960 の raw 画像のバンブルビー XB3 カラー カメラを使用し、外側の 2 つのカメラから画像を取得しています。

   // Read raw file 
   //pFile = fopen ( "FlyCap.raw" , "rb" );
   pFile = fopen ( argv[1] , "rb" );
   if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

   // Set raw file size 
   ISize = (numCols*numRows*bytesPerPixel);

   // allocate memory to contain the whole file:
   buffer = (unsigned char*) malloc (sizeof(char)*ISize);
   if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

   // copy the file into the buffer:
   result = fread (buffer,1,ISize,pFile);
   if (result != ISize) {fputs ("Reading error",stderr); exit (3);}

   // Create the FlyCapture Context for processing
   fe = flycaptureCreateContext( &flycapture );
   _HANDLE_FLYCAPTURE_ERROR( "flycaptureCreateContext()", fe );

   fe = flycaptureSetColorProcessingMethod(flycapture, FLYCAPTURE_HQLINEAR);
   _HANDLE_FLYCAPTURE_ERROR( "flycaptureSetColorProcessingMethod()", fe );

   fe = flycaptureSetColorTileFormat(flycapture, FLYCAPTURE_STIPPLEDFORMAT_GBRG);
   _HANDLE_FLYCAPTURE_ERROR( "flycaptureSetColorTileFormat()", fe );

   //Import the raw image in buffer into FlyCaptureImage structure
   flycaptureImage.iCols = 1280;
   flycaptureImage.iRows = 960;
   flycaptureImage.iNumImages = 2;
   flycaptureImage.bStippled = true;
   flycaptureImage.pixelFormat = FLYCAPTURE_RAW16;   
   flycaptureImage.iRowInc = 2560;
   flycaptureImage.timeStamp.ulSeconds = 100;
   flycaptureImage.timeStamp.ulMicroSeconds = 100;
   flycaptureImage.pData = buffer;

   // Create buffers for holding the color and mono images
   unsigned char* rowIntColor = 
   new unsigned char[ numCols * numRows * flycaptureImage.iNumImages * 4 ];
   unsigned char* rowIntMono = 
   new unsigned char[ numCols * numRows * flycaptureImage.iNumImages ];

   // Create a temporary FlyCaptureImage for preparing the stereo image
   FlyCaptureImage tempColorImage;
   FlyCaptureImage tempMonoImage;

   tempColorImage.pData = rowIntColor;
   tempMonoImage.pData = rowIntMono;


   // Convert the pixel interleaved raw data to row interleaved format
   fe = flycapturePrepareStereoImage( flycapture, flycaptureImage, &tempMonoImage,   &tempColorImage  );
   _HANDLE_FLYCAPTURE_ERROR( "flycapturePrepareStereoImage()", fe );

   //Save side-by-side color stereo image
   fe = flycaptureSaveImage( flycapture, &tempColorImage, stereoimg, FLYCAPTURE_FILEFORMAT_PPM );
   _HANDLE_FLYCAPTURE_ERROR( "flycaptureSaveImage()", fe );  

   printf ("Saving Stereo...\n");

これまでのところ、Triclops API をまったく使用していないことに注意してください。からの出力はflycaptureSaveImage();、Triclops メソッドにフィードされるものです。その時点で、カラー対モノを扱ういくつかのオプションがあります。'stereoto3dpoints.cpp' と呼ばれる Triclops API に付属している Point Gray サンプルを見てください。これがお役に立てば幸いです。

于 2012-09-14T12:43:20.817 に答える