Revision: 8556
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8556&view=rev
Author:   hsujohnhsu
Date:     2010-02-17 23:39:55 +0000 (Wed, 17 Feb 2010)

Log Message:
-----------
add bayer camera support

Modified Paths:
--------------
    code/gazebo/trunk/server/rendering/OgreCamera.cc
    code/gazebo/trunk/server/rendering/OgreCamera.hh

Modified: code/gazebo/trunk/server/rendering/OgreCamera.cc
===================================================================
--- code/gazebo/trunk/server/rendering/OgreCamera.cc    2010-02-17 22:13:05 UTC 
(rev 8555)
+++ code/gazebo/trunk/server/rendering/OgreCamera.cc    2010-02-17 23:39:55 UTC 
(rev 8556)
@@ -58,6 +58,7 @@
 
   this->saveFrameBuffer = NULL;
   this->saveCount = 0;
+  this->bayerFrameBuffer = NULL;
 
   this->myCount = cameraCounter++;
 
@@ -98,6 +99,9 @@
   if (this->saveFrameBuffer)
     delete [] this->saveFrameBuffer;
 
+  if (this->bayerFrameBuffer)
+    delete [] this->bayerFrameBuffer;
+
   delete this->nearClipP;
   delete this->farClipP;
   delete this->saveFramesP;
@@ -142,9 +146,18 @@
       this->imageFormat = Ogre::PF_R8G8B8;
     else if (this->imageFormatP->GetValue() == "B8G8R8")
       this->imageFormat = Ogre::PF_B8G8R8;
+    else if ( (this->imageFormatP->GetValue() == "BAYER_RGGB8") ||
+              (this->imageFormatP->GetValue() == "BAYER_BGGR8") ||
+              (this->imageFormatP->GetValue() == "BAYER_GBRG8") ||
+              (this->imageFormatP->GetValue() == "BAYER_GRBG8") )
+    {
+      // let ogre generate rgb8 images for all bayer format requests
+      // then post process to produce actual bayer images
+      this->imageFormat = Ogre::PF_R8G8B8;
+    }
     else
     {
-      std::cerr << "Error parsing image format, using default 
Ogre::PF_R8G8B8\n";
+      std::cerr << "Error parsing image format (" << 
this->imageFormatP->GetValue() << "), using default Ogre::PF_R8G8B8\n";
       this->imageFormat = Ogre::PF_R8G8B8;
     }
   }
@@ -417,9 +430,14 @@
     return 3;
   else if (this->imageFormatP->GetValue() == "B8G8R8")
     return 3;
+  else if ( (this->imageFormatP->GetValue() == "BAYER_RGGB8") ||
+            (this->imageFormatP->GetValue() == "BAYER_BGGR8") ||
+            (this->imageFormatP->GetValue() == "BAYER_GBRG8") ||
+            (this->imageFormatP->GetValue() == "BAYER_GRBG8") )
+    return 1;
   else
   {
-    std::cerr << "Error parsing image format, using default Ogre::PF_R8G8B8\n";
+    std::cerr << "Error parsing image format (" << 
this->imageFormatP->GetValue() << "), using default Ogre::PF_R8G8B8\n";
     return 3;
   }
 }
@@ -600,7 +618,22 @@
   if (i!=0)
     gzerr(0) << "Camera index must be zero for mono cam";
 
-  return this->saveFrameBuffer;
+  int width = this->imageSizeP->GetValue().x;
+  int height = this->imageSizeP->GetValue().y;
+
+  // do last minute conversion if Bayer pattern is requested, go from R8G8B8
+  if ( (this->imageFormatP->GetValue() == "BAYER_RGGB8") ||
+       (this->imageFormatP->GetValue() == "BAYER_BGGR8") ||
+       (this->imageFormatP->GetValue() == "BAYER_GBRG8") ||
+       (this->imageFormatP->GetValue() == "BAYER_GRBG8") )
+  {
+    if (!this->bayerFrameBuffer)
+      this->bayerFrameBuffer = new unsigned char[width*height];
+    
this->ConvertRGBToBAYER(this->bayerFrameBuffer,this->saveFrameBuffer,this->imageFormatP->GetValue(),width,height);
+    return this->bayerFrameBuffer;
+  }
+  else
+    return this->saveFrameBuffer;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -721,3 +754,107 @@
     }
   }
 }
+
+////////////////////////////////////////////////////////////////////////////////
+/// post process, convert from rgb to bayer
+void OgreCamera::ConvertRGBToBAYER(unsigned char* dst, unsigned char* src, 
std::string format,int width, int height)
+{
+  // do last minute conversion if Bayer pattern is requested, go from R8G8B8
+  if (format == "BAYER_RGGB8")
+  {
+    for (int i=0;i<width;i++)
+    {
+      for (int j=0;j<height;j++)
+      {
+        //
+        // RG
+        // GB
+        //
+        // determine position
+        if (j%2) // even column
+          if (i%2) // even row, red
+            dst[i+j*width] = src[i*3+j*width*3+0];
+          else // odd row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+        else // odd column
+          if (i%2) // even row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+          else // odd row, blue
+            dst[i+j*width] = src[i*3+j*width*3+2];
+      }
+    }
+  }
+  else if (format == "BAYER_BGGR8")
+  {
+    for (int i=0;i<width;i++)
+    {
+      for (int j=0;j<height;j++)
+      {
+        //
+        // BG
+        // GR
+        //
+        // determine position
+        if (j%2) // even column
+          if (i%2) // even row, blue
+            dst[i+j*width] = src[i*3+j*width*3+2];
+          else // odd row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+        else // odd column
+          if (i%2) // even row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+          else // odd row, red
+            dst[i+j*width] = src[i*3+j*width*3+0];
+      }
+    }
+  }
+  else if (format == "BAYER_GBRG8")
+  {
+    for (int i=0;i<width;i++)
+    {
+      for (int j=0;j<height;j++)
+      {
+        //
+        // GB
+        // RG
+        //
+        // determine position
+        if (j%2) // even column
+          if (i%2) // even row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+          else // odd row, blue
+            dst[i+j*width] = src[i*3+j*width*3+2];
+        else // odd column
+          if (i%2) // even row, red
+            dst[i+j*width] = src[i*3+j*width*3+0];
+          else // odd row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+      }
+    }
+  }
+  else if (format == "BAYER_GRBG8")
+  {
+    for (int i=0;i<width;i++)
+    {
+      for (int j=0;j<height;j++)
+      {
+        //
+        // GR
+        // BG
+        //
+        // determine position
+        if (j%2) // even column
+          if (i%2) // even row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+          else // odd row, red
+            dst[i+j*width] = src[i*3+j*width*3+0];
+        else // odd column
+          if (i%2) // even row, blue
+            dst[i+j*width] = src[i*3+j*width*3+2];
+          else // odd row, green
+            dst[i+j*width] = src[i*3+j*width*3+1];
+      }
+    }
+  }
+
+}

Modified: code/gazebo/trunk/server/rendering/OgreCamera.hh
===================================================================
--- code/gazebo/trunk/server/rendering/OgreCamera.hh    2010-02-17 22:13:05 UTC 
(rev 8555)
+++ code/gazebo/trunk/server/rendering/OgreCamera.hh    2010-02-17 23:39:55 UTC 
(rev 8556)
@@ -218,6 +218,9 @@
     /// \brief Set whether to view the world in wireframe
     public: void ShowWireframe(bool s);
 
+    /// \brief if user requests bayer image, post process rgb from ogre to 
generate bayer formats
+    private: void ConvertRGBToBAYER(unsigned char* dst, unsigned char* src, 
std::string format,int width, int height);
+
     // Save the camera frame
     protected: virtual void SaveFrame();
 
@@ -237,6 +240,7 @@
   
     // Info for saving images
     protected: unsigned char *saveFrameBuffer;
+    protected: unsigned char *bayerFrameBuffer;
     protected: unsigned int saveCount;
     protected: ParamT<bool> *saveFramesP;
     protected: ParamT<std::string> *savePathnameP;


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Download Intel&reg; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs 
proactively, and fine-tune applications for parallel performance. 
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to