Creating color disparity images from mono images using Bumblebee2 and BumblebeeXB3 cameras

Last Revision Date: 12/21/2015

This article explains how to create color disparity images from Bumblebee2/XB3 cameras. By default, the Triclops API does not support color disparity images. Use the following code snippet from the triclopsDemo.exe to remap a mono disparity image into a color disparity image.

void

CPGRStereoDoc::remapDisparityImage()

{

     TriclopsError          te; 

     TriclopsBool                    bSubpixelOn;

 

     te = triclopsGetSubpixelInterpolation( m_triclopsContext, &bSubpixelOn ); 

     ASSERT( te == TriclopsErrorOk );

 

      // if mapping parameters have not changed, this function returns

      // without regenerating the tables

     generateLookupTables();

 

 

      if ( bSubpixelOn )

     {

           TriclopsImage16     imageDisparity;

           // get the 16 bit depth image

           te = triclopsGetImage16(

                m_triclopsContext, TriImg16_DISPARITY, TriCam_REFERENCE, &imageDisparity );

 

          if ( te != TriclopsErrorOk )

           {

                     ASSERT( false );

               return;

           }

 

      unsigned short* pRow       = imageDisparity.data;

     int iPixelInc                  = imageDisparity.rowinc/2;

 

     unsigned char*  pucDisp = m_arpBitmap[ IMAGE_DISPARITY ]->getDataPointer();

 

      for ( int r = 0, I = 0; r < imageDisparity.nrows; r++ )

      {

           for ( int c = 0; c < imageDisparity.ncols; c++ )

           {

                if (pRow[c] >= 0xFF00)

                {

                     // for an invalid pixel, only take the bottom 8-bits

                     int index = 0x00FF & pRow[c];

 

                     pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][0]; // blue

                     pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][1]; // green

                     pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][2]; // red

                     i++; // unused

               }

                else

                {

                     int index = pRow[c] >> DISPARITY_LUT_SHIFT_BITS;

                     pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][0]; // blue

                     pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][1]; // green

                     pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][2]; // red

                      i++; // unused

                }

           }

           pRow   += iPixelInc;

      }

 }

 else // if ( bSubpixelOn )

 {

           // subpixel is not on – let’s remap with the 8-bit disparity image

           TriclopsImage   imageDisparity;

           // get the 8-bit depth image

           te = triclopsGetImage(

                m_triclopsContext, TriImg_DISPARITY, TriCam_REFERENCE, &imageDisparity );

           if ( te != TriclopsErrorOk )

           {

                    ASSERT(false );

                return;

           }

 

           unsigned char* pRow = imageDisparity.data;

          Int iPixelInc     = imageDisparity.rowinc;

 

      Unsigned char*  pucDisp = m_arpBitmap[ IMAGE_DISPARITY ]->getDataPointer();

      for ( int r =0,i =0; r < imageDisparity.nrows; r++ )

      {

                for ( int c = 0; c < imageDisparity.ncols; c++ )

                {

                     if (pRow[c] > 239)

                     {

                          // invalid pixel

                          int index = pRow[c];

                          pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][0]; // red

                          pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][1]; // green

                          pucDisp[ i++ ] = m_ucInvalidDisparityMapLUT[index][2]; // blue

                          i++; // unused

                     }

                     else

                     {

                          // valid pixel

                          int index = pRow[c] << (8 - DISPARITY_LUT_SHIFT_BITS);

                          pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][0]; // red

                          pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][1]; // green

                          pucDisp[ i++ ] = m_ucValidDisparityMapLUT[index][2]; // blue

                          ++; // unused

                     }

                }

                pRow     += iPixelInc;

           }

     }

}