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