2012-04-25 52 views
2

还是完全依赖大黄蜂(或其他任何点灰度成像传感器)? 我正在尝试链接大黄蜂2立体声装置附带的立体声处理API以处理一些脱机图像。看起来,Triclops立体声功能需要一些上下文标记和校准文件,形式为input.cal和input.ppm(即包含两个立体声整流图像的图像某种程度上模糊和覆盖)。如何从其他离线图像获取此输入.ppm文件,以便仍然可以使用triclops立体声API。那么校准文件input.cal怎么样,它可以被获得,以便它与离线图像一致,以及如何?可以使用Triclops立体声API来处理离线图像吗?

回答

2

是的,Triclops API可以用来处理离线图像。您指出的要求是来自相机和图像文件的校准文件(.cal)。校准文件最好在图像捕捉时提取,尽管根据我的经验,除非您更改设置,否则它始终保持不变。为了满足Triclops API的输入,您还需要使用Point Gray Fly Capture API,因为它提供了图像转换的方法。我的项目正在做你正在问的所有问题。我在场中捕捉原始像素交错图像,然后使用FlyCapture和Triclops API处理它们以创建校正和视差图像以及来自立体对的点云。

检查Point Grey示例及其API文档以了解如何捕获校准文件。本质上是这样的:flycaptureGetCalibrationFileFromCamera(context, &szCalFile);其中上下文是'相机上下文'

您的初始图像文件格式将改变转换方法,但在我的情况下,这里是我如何使用C++从原始转换为立体声。我使用的是大黄蜂XB3彩色摄像机与原始图像1280×960的尺寸和从外两个摄像头抓取图像:

// 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方法的输入。有一些选项在处理颜色与单声道。看看他们的Triclops API附带的Point Grey示例,名为“stereoto3dpoints.cpp”,它从我离开的地方开始。我希望这能够帮到你。

相关问题