From 3e8687d09214d9fdc6d644ab0b2eefd7e810a80e Mon Sep 17 00:00:00 2001 From: tejalbarnwal Date: Fri, 24 Mar 2023 19:36:07 +0530 Subject: [PATCH 1/9] Add: support for RGB image to RGGB bayer image conversion Signed-off-by: tejalbarnwal --- include/gz/rendering/Utils.hh | 5 +++ ogre/src/OgreRenderTarget.cc | 48 ++++++++++++++++++++++++-- src/Utils.cc | 63 +++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/include/gz/rendering/Utils.hh b/include/gz/rendering/Utils.hh index 61b16fb4e..990227fa2 100644 --- a/include/gz/rendering/Utils.hh +++ b/include/gz/rendering/Utils.hh @@ -29,6 +29,7 @@ #include "gz/rendering/config.hh" #include "gz/rendering/Export.hh" #include "gz/rendering/RayQuery.hh" +#include "gz/rendering/Image.hh" namespace gz @@ -111,6 +112,10 @@ namespace gz gz::math::Matrix3d projectionToCameraIntrinsic( const gz::math::Matrix4d &_projectionMatrix, double _width, double _height); + + // \brief convert a rgb image data into bayer image data + GZ_RENDERING_VISIBLE + void ConvertRGBToBayer(Image &_image); } } } diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index 4a8a1adcf..567f6ae37 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -46,6 +46,10 @@ #include "gz/rendering/ogre/OgreScene.hh" #include "gz/rendering/ogre/OgreCamera.hh" #include "gz/rendering/ogre/OgreIncludes.hh" +#include "gz/rendering/Utils.hh" + +//teju +#include using namespace gz; using namespace rendering; @@ -68,6 +72,8 @@ OgreRenderTarget::~OgreRenderTarget() ////////////////////////////////////////////////// void OgreRenderTarget::Copy(Image &_image) const { + //teju + std::cout << "enter copy\n"; if (nullptr == this->RenderTarget()) return; @@ -81,9 +87,36 @@ void OgreRenderTarget::Copy(Image &_image) const } void* data = _image.Data(); - Ogre::PixelFormat imageFormat = OgreConversions::Convert(_image.Format()); + // Ogre::PixelFormat imageFormat = OgreConversions::Convert(_image.Format()); + Ogre::PixelFormat imageFormat; + if (_image.Format() == PF_BAYER_RGGB8) + { + //teju + std::cout << "check R1\n"; + imageFormat = OgreConversions::Convert(PF_R8G8B8); + } + else + { + //teju + std::cout << "check R2\n"; + imageFormat = OgreConversions::Convert(_image.Format()); + } + + //teju + std::cout << "check R3\n"; + Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); this->RenderTarget()->copyContentsToMemory(ogrePixelBox); + + //teju + std::cout << "check R4\n"; + if (_image.Format() == PF_BAYER_RGGB8) + { + //teju + std::cout << "check R5\n"; + gz::rendering::ConvertRGBToBayer(_image); + std::cout << "check R6\n"; + } } ////////////////////////////////////////////////// @@ -360,8 +393,19 @@ void OgreRenderTexture::DestroyTarget() ////////////////////////////////////////////////// void OgreRenderTexture::BuildTarget() { + //teju + std::cout << "enter build target\n"; Ogre::TextureManager &manager = Ogre::TextureManager::getSingleton(); - Ogre::PixelFormat ogreFormat = OgreConversions::Convert(this->format); + // Ogre::PixelFormat ogreFormat = OgreConversions::Convert(this->format); + Ogre::PixelFormat ogreFormat; + if (this->format == PF_BAYER_RGGB8) + { + ogreFormat = OgreConversions::Convert(PF_R8G8B8); + } + else + { + ogreFormat = OgreConversions::Convert(this->format); + } // check if target fsaa is supported unsigned int fsaa = 0; diff --git a/src/Utils.cc b/src/Utils.cc index a65d6b44f..14d554740 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -26,7 +26,12 @@ #include "gz/rendering/Camera.hh" #include "gz/rendering/RayQuery.hh" +#include "gz/rendering/PixelFormat.hh" #include "gz/rendering/Utils.hh" +//teju +#include +//teju + namespace gz { @@ -248,6 +253,64 @@ gz::math::AxisAlignedBox transformAxisAlignedBox( } return gz::math::AxisAlignedBox(min, max); } + +///////////////////////////////////////////////// +void ConvertRGBToBayer(Image &_image) +{ + std::cout << "enter cnvrsn function\n"; + unsigned char *sourceImageData = _image.Data(); + + unsigned int width = _image.Width(); + unsigned int height = _image.Height(); + //teju + std::cout << "width: " << width << "\n"; + std::cout << "Height: " << height << "\n"; + + unsigned char *destImageData = new unsigned char[width * height]; + + //teju + std::cout << "image data conversion begins now\n"; + + if (_image.Format() == PF_BAYER_RGGB8) + { + for (unsigned int i=0; i Date: Fri, 24 Mar 2023 23:29:24 +0530 Subject: [PATCH 2/9] Remove: cout statements Signed-off-by: tejalbarnwal --- ogre/src/OgreRenderTarget.cc | 19 ------------------- src/Utils.cc | 25 ++++++++----------------- 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index 567f6ae37..c03903097 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -48,8 +48,6 @@ #include "gz/rendering/ogre/OgreIncludes.hh" #include "gz/rendering/Utils.hh" -//teju -#include using namespace gz; using namespace rendering; @@ -72,8 +70,6 @@ OgreRenderTarget::~OgreRenderTarget() ////////////////////////////////////////////////// void OgreRenderTarget::Copy(Image &_image) const { - //teju - std::cout << "enter copy\n"; if (nullptr == this->RenderTarget()) return; @@ -91,31 +87,19 @@ void OgreRenderTarget::Copy(Image &_image) const Ogre::PixelFormat imageFormat; if (_image.Format() == PF_BAYER_RGGB8) { - //teju - std::cout << "check R1\n"; imageFormat = OgreConversions::Convert(PF_R8G8B8); } else { - //teju - std::cout << "check R2\n"; imageFormat = OgreConversions::Convert(_image.Format()); } - //teju - std::cout << "check R3\n"; - Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); this->RenderTarget()->copyContentsToMemory(ogrePixelBox); - //teju - std::cout << "check R4\n"; if (_image.Format() == PF_BAYER_RGGB8) { - //teju - std::cout << "check R5\n"; gz::rendering::ConvertRGBToBayer(_image); - std::cout << "check R6\n"; } } @@ -393,10 +377,7 @@ void OgreRenderTexture::DestroyTarget() ////////////////////////////////////////////////// void OgreRenderTexture::BuildTarget() { - //teju - std::cout << "enter build target\n"; Ogre::TextureManager &manager = Ogre::TextureManager::getSingleton(); - // Ogre::PixelFormat ogreFormat = OgreConversions::Convert(this->format); Ogre::PixelFormat ogreFormat; if (this->format == PF_BAYER_RGGB8) { diff --git a/src/Utils.cc b/src/Utils.cc index 14d554740..93ec65c81 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -28,9 +28,9 @@ #include "gz/rendering/RayQuery.hh" #include "gz/rendering/PixelFormat.hh" #include "gz/rendering/Utils.hh" -//teju -#include -//teju + +#include +#include namespace gz @@ -257,19 +257,14 @@ gz::math::AxisAlignedBox transformAxisAlignedBox( ///////////////////////////////////////////////// void ConvertRGBToBayer(Image &_image) { - std::cout << "enter cnvrsn function\n"; unsigned char *sourceImageData = _image.Data(); unsigned int width = _image.Width(); unsigned int height = _image.Height(); - //teju - std::cout << "width: " << width << "\n"; - std::cout << "Height: " << height << "\n"; - - unsigned char *destImageData = new unsigned char[width * height]; - //teju - std::cout << "image data conversion begins now\n"; + // unsigned char *destImageData = new unsigned char[width * height]; + std::unique_ptr destImageData = + std::make_unique(width*height); if (_image.Format() == PF_BAYER_RGGB8) { @@ -302,12 +297,8 @@ void ConvertRGBToBayer(Image &_image) } } - //teju - std::cout << "image converted\n"; - std::cout << "modified image will be copied now\n"; - - memcpy(sourceImageData, destImageData, sizeof(unsigned char)*width*height); - delete [] destImageData; + memcpy(sourceImageData, destImageData.get(), sizeof(unsigned char)*width*height); + // delete[] destImageData; } } From 8de9d58748f4d011027fe181cfc3455643abc53e Mon Sep 17 00:00:00 2001 From: tejalbarnwal Date: Tue, 28 Mar 2023 15:05:14 +0530 Subject: [PATCH 3/9] remove commented out code Signed-off-by: tejalbarnwal --- src/Utils.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Utils.cc b/src/Utils.cc index 93ec65c81..024bd7965 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -262,7 +262,6 @@ void ConvertRGBToBayer(Image &_image) unsigned int width = _image.Width(); unsigned int height = _image.Height(); - // unsigned char *destImageData = new unsigned char[width * height]; std::unique_ptr destImageData = std::make_unique(width*height); @@ -298,7 +297,6 @@ void ConvertRGBToBayer(Image &_image) } memcpy(sourceImageData, destImageData.get(), sizeof(unsigned char)*width*height); - // delete[] destImageData; } } From 7bd6d99189c048a70e03d3611934e43d5f65d32c Mon Sep 17 00:00:00 2001 From: tejalbarnwal Date: Wed, 29 Mar 2023 21:40:01 +0530 Subject: [PATCH 4/9] Add support for all bayer formats Signed-off-by: tejalbarnwal --- include/gz/rendering/PixelFormat.hh | 8 +- include/gz/rendering/Utils.hh | 5 +- ogre/src/OgreRenderTarget.cc | 25 ++++++- src/PixelFormat.cc | 12 +-- src/Utils.cc | 111 ++++++++++++++++++++++++++-- 5 files changed, 137 insertions(+), 24 deletions(-) diff --git a/include/gz/rendering/PixelFormat.hh b/include/gz/rendering/PixelFormat.hh index 3617f8c43..58c6b02df 100644 --- a/include/gz/rendering/PixelFormat.hh +++ b/include/gz/rendering/PixelFormat.hh @@ -43,10 +43,10 @@ namespace gz PF_BAYER_RGGB8 = 4, /// < Bayer BGGR, 1-byte per channel PF_BAYER_BGGR8 = 5, - /// < Bayer GBGR, 1-byte per channel - PF_BAYER_GBGR8 = 6, - /// < Bayer GRGB, 1-byte per channel - PF_BAYER_GRGB8 = 7, + /// < Bayer GBRG, 1-byte per channel + PF_BAYER_GBRG8 = 6, + /// < Bayer GRBG, 1-byte per channel + PF_BAYER_GRBG8 = 7, // Float32 format one channel PF_FLOAT32_R = 8, // Float32 format and RGB diff --git a/include/gz/rendering/Utils.hh b/include/gz/rendering/Utils.hh index 990227fa2..da66468d3 100644 --- a/include/gz/rendering/Utils.hh +++ b/include/gz/rendering/Utils.hh @@ -18,6 +18,7 @@ #define GZ_RENDERING_UTILS_HH_ #include +#include #include #include @@ -112,10 +113,10 @@ namespace gz gz::math::Matrix3d projectionToCameraIntrinsic( const gz::math::Matrix4d &_projectionMatrix, double _width, double _height); - + // \brief convert a rgb image data into bayer image data GZ_RENDERING_VISIBLE - void ConvertRGBToBayer(Image &_image); + std::unique_ptr convertRGBToBayer(Image &_image); } } } diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index c03903097..167254f1e 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -48,6 +48,9 @@ #include "gz/rendering/ogre/OgreIncludes.hh" #include "gz/rendering/Utils.hh" +#include +#include + using namespace gz; using namespace rendering; @@ -85,7 +88,10 @@ void OgreRenderTarget::Copy(Image &_image) const void* data = _image.Data(); // Ogre::PixelFormat imageFormat = OgreConversions::Convert(_image.Format()); Ogre::PixelFormat imageFormat; - if (_image.Format() == PF_BAYER_RGGB8) + if ((_image.Format() == PF_BAYER_RGGB8) || + (_image.Format() == PF_BAYER_BGGR8) || + (_image.Format() == PF_BAYER_GBRG8) || + (_image.Format() == PF_BAYER_GRBG8)) { imageFormat = OgreConversions::Convert(PF_R8G8B8); } @@ -97,10 +103,18 @@ void OgreRenderTarget::Copy(Image &_image) const Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); this->RenderTarget()->copyContentsToMemory(ogrePixelBox); - if (_image.Format() == PF_BAYER_RGGB8) + if ((_image.Format() == PF_BAYER_RGGB8) || + (_image.Format() == PF_BAYER_BGGR8) || + (_image.Format() == PF_BAYER_GBRG8) || + (_image.Format() == PF_BAYER_GRBG8)) { - gz::rendering::ConvertRGBToBayer(_image); + std::unique_ptr destImageData + = gz::rendering::convertRGBToBayer(_image); + memcpy( _image.Data(), + destImageData.get(), + sizeof(unsigned char)*width*height); } + } ////////////////////////////////////////////////// @@ -379,7 +393,10 @@ void OgreRenderTexture::BuildTarget() { Ogre::TextureManager &manager = Ogre::TextureManager::getSingleton(); Ogre::PixelFormat ogreFormat; - if (this->format == PF_BAYER_RGGB8) + if ((this->format == PF_BAYER_RGGB8) || + (this->format == PF_BAYER_BGGR8) || + (this->format == PF_BAYER_GBRG8) || + (this->format == PF_BAYER_GRBG8)) { ogreFormat = OgreConversions::Convert(PF_R8G8B8); } diff --git a/src/PixelFormat.cc b/src/PixelFormat.cc index 2a2275105..1f3cbf470 100644 --- a/src/PixelFormat.cc +++ b/src/PixelFormat.cc @@ -31,8 +31,8 @@ const char *PixelUtil::names[PF_COUNT] = "B8G8R8", "BAYER_RGGB8", "BAYER_BGGR8", - "BAYER_GBGR8", - "BAYER_GRGB8", + "BAYER_GBRG8", + "BAYER_GRBG8", "FLOAT32_R", "FLOAT32_RGBA", "FLOAT32_RGB", @@ -55,9 +55,9 @@ const unsigned char PixelUtil::channelCounts[PF_COUNT] = 4, // BAYER_BGGR8 4, - // BAYER_GBGR8 + // BAYER_GBRG8 4, - // BAYER_GRGB8 + // BAYER_GRBG8 4, // PF_FLOAT32_R 1, @@ -86,9 +86,9 @@ const unsigned char PixelUtil::channelByteCounts[PF_COUNT] = 1, // BAYER_BGGR8 1, - // BAYER_GBGR8 + // BAYER_GBRG8 1, - // BAYER_GRGB8 + // BAYER_GRBG8 1, // PF_FLOAT32_R 4, diff --git a/src/Utils.cc b/src/Utils.cc index 024bd7965..02d598180 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -29,9 +29,6 @@ #include "gz/rendering/PixelFormat.hh" #include "gz/rendering/Utils.hh" -#include -#include - namespace gz { @@ -255,21 +252,21 @@ gz::math::AxisAlignedBox transformAxisAlignedBox( } ///////////////////////////////////////////////// -void ConvertRGBToBayer(Image &_image) +std::unique_ptr convertRGBToBayer(Image &_image) { unsigned char *sourceImageData = _image.Data(); unsigned int width = _image.Width(); unsigned int height = _image.Height(); - std::unique_ptr destImageData = + std::unique_ptr destImageData = std::make_unique(width*height); if (_image.Format() == PF_BAYER_RGGB8) { - for (unsigned int i=0; i Date: Sun, 9 Apr 2023 15:30:02 +0530 Subject: [PATCH 5/9] Add support for bayer formats to Ogre2 Signed-off-by: tejalbarnwal --- include/gz/rendering/Utils.hh | 2 +- ogre/src/OgreRenderTarget.cc | 7 ++----- ogre2/src/Ogre2RenderTarget.cc | 26 +++++++++++++++++++++++++- src/Utils.cc | 8 ++++---- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/include/gz/rendering/Utils.hh b/include/gz/rendering/Utils.hh index da66468d3..e4516bb62 100644 --- a/include/gz/rendering/Utils.hh +++ b/include/gz/rendering/Utils.hh @@ -116,7 +116,7 @@ namespace gz // \brief convert a rgb image data into bayer image data GZ_RENDERING_VISIBLE - std::unique_ptr convertRGBToBayer(Image &_image); + Image convertRGBToBayer(Image &_image); } } } diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index 167254f1e..7bdf99f1b 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -49,8 +49,6 @@ #include "gz/rendering/Utils.hh" #include -#include - using namespace gz; using namespace rendering; @@ -108,10 +106,9 @@ void OgreRenderTarget::Copy(Image &_image) const (_image.Format() == PF_BAYER_GBRG8) || (_image.Format() == PF_BAYER_GRBG8)) { - std::unique_ptr destImageData - = gz::rendering::convertRGBToBayer(_image); + Image destImage = gz::rendering::convertRGBToBayer(_image); memcpy( _image.Data(), - destImageData.get(), + destImage.Data(), sizeof(unsigned char)*width*height); } diff --git a/ogre2/src/Ogre2RenderTarget.cc b/ogre2/src/Ogre2RenderTarget.cc index 06d087eac..5a119b28b 100644 --- a/ogre2/src/Ogre2RenderTarget.cc +++ b/ogre2/src/Ogre2RenderTarget.cc @@ -26,6 +26,9 @@ #include "gz/rendering/ogre2/Ogre2Material.hh" #include "gz/rendering/ogre2/Ogre2RenderTarget.hh" #include "gz/rendering/ogre2/Ogre2Scene.hh" +#include "gz/rendering/Utils.hh" + +#include namespace gz { @@ -360,7 +363,18 @@ void Ogre2RenderTarget::Copy(Image &_image) const return; } - Ogre::PixelFormatGpu dstOgrePf = Ogre2Conversions::Convert(_image.Format()); + Ogre::PixelFormatGpu dstOgrePf; + if ((_image.Format() == PF_BAYER_RGGB8) || + (_image.Format() == PF_BAYER_BGGR8) || + (_image.Format() == PF_BAYER_GBRG8) || + (_image.Format() == PF_BAYER_GRBG8)) + { + dstOgrePf = Ogre2Conversions::Convert(PF_R8G8B8); + } + else + { + dstOgrePf = Ogre2Conversions::Convert(_image.Format()); + } Ogre::TextureGpu *texture = this->RenderTarget(); if (Ogre::PixelFormatGpuUtils::isSRgb(dstOgrePf) != @@ -389,6 +403,16 @@ void Ogre2RenderTarget::Copy(Image &_image) const Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, dstOgrePf); + if ((_image.Format() == PF_BAYER_RGGB8) || + (_image.Format() == PF_BAYER_BGGR8) || + (_image.Format() == PF_BAYER_GBRG8) || + (_image.Format() == PF_BAYER_GRBG8)) + { + Image destImage = gz::rendering::convertRGBToBayer(_image); + memcpy( _image.Data(), + destImage.Data(), + sizeof(unsigned char)*width*height); + } } ////////////////////////////////////////////////// diff --git a/src/Utils.cc b/src/Utils.cc index 02d598180..c4972279f 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -252,15 +252,15 @@ gz::math::AxisAlignedBox transformAxisAlignedBox( } ///////////////////////////////////////////////// -std::unique_ptr convertRGBToBayer(Image &_image) +Image convertRGBToBayer(Image &_image) { unsigned char *sourceImageData = _image.Data(); unsigned int width = _image.Width(); unsigned int height = _image.Height(); - std::unique_ptr destImageData = - std::make_unique(width*height); + Image destImage(width, height, PF_L8); + unsigned char *destImageData = destImage.Data(); if (_image.Format() == PF_BAYER_RGGB8) { @@ -390,7 +390,7 @@ std::unique_ptr convertRGBToBayer(Image &_image) } } - return destImageData; + return destImage; } From 5a47f9909c19c0756b159d970237a7e7edffd656 Mon Sep 17 00:00:00 2001 From: tejalbarnwal Date: Sun, 9 Apr 2023 15:49:11 +0530 Subject: [PATCH 6/9] Remove white spaces Signed-off-by: tejalbarnwal --- ogre2/src/Ogre2RenderTarget.cc | 2 +- src/Utils.cc | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ogre2/src/Ogre2RenderTarget.cc b/ogre2/src/Ogre2RenderTarget.cc index 5a119b28b..b703ca40c 100644 --- a/ogre2/src/Ogre2RenderTarget.cc +++ b/ogre2/src/Ogre2RenderTarget.cc @@ -412,7 +412,7 @@ void Ogre2RenderTarget::Copy(Image &_image) const memcpy( _image.Data(), destImage.Data(), sizeof(unsigned char)*width*height); - } + } } ////////////////////////////////////////////////// diff --git a/src/Utils.cc b/src/Utils.cc index c4972279f..5593acac0 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -393,8 +393,6 @@ Image convertRGBToBayer(Image &_image) return destImage; } - -} } } - +} \ No newline at end of file From 79a83c6f02d1badd3d68eca36c73caff86adabea Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Thu, 13 Apr 2023 18:45:12 +0000 Subject: [PATCH 7/9] change bayer channel count to 1, fix crash Signed-off-by: Ian Chen --- include/gz/rendering/Utils.hh | 7 +++++-- ogre/src/OgreRenderTarget.cc | 28 ++++++++++------------------ ogre2/src/Ogre2RenderTarget.cc | 22 ++++++++++++++-------- src/PixelFormat.cc | 8 ++++---- src/Utils.cc | 16 ++++++++-------- 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/include/gz/rendering/Utils.hh b/include/gz/rendering/Utils.hh index e4516bb62..3233f9024 100644 --- a/include/gz/rendering/Utils.hh +++ b/include/gz/rendering/Utils.hh @@ -114,9 +114,12 @@ namespace gz const gz::math::Matrix4d &_projectionMatrix, double _width, double _height); - // \brief convert a rgb image data into bayer image data + /// \brief convert an RGB image data into bayer image data + /// \param[in] _image Input RGB image + /// \param[in] _bayer Bayer format to convert to + /// \return Image in bayer format GZ_RENDERING_VISIBLE - Image convertRGBToBayer(Image &_image); + Image convertRGBToBayer(const Image &_image, PixelFormat _bayerFormat); } } } diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index 7bdf99f1b..3c9dbc272 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -74,7 +74,6 @@ void OgreRenderTarget::Copy(Image &_image) const if (nullptr == this->RenderTarget()) return; - // TODO(anyone): handle Bayer conversions // TODO(anyone): handle ogre version differences if (_image.Width() != this->width || _image.Height() != this->height) @@ -83,35 +82,28 @@ void OgreRenderTarget::Copy(Image &_image) const return; } - void* data = _image.Data(); - // Ogre::PixelFormat imageFormat = OgreConversions::Convert(_image.Format()); Ogre::PixelFormat imageFormat; if ((_image.Format() == PF_BAYER_RGGB8) || (_image.Format() == PF_BAYER_BGGR8) || (_image.Format() == PF_BAYER_GBRG8) || (_image.Format() == PF_BAYER_GRBG8)) { + // create tmp color image to get data from gpu imageFormat = OgreConversions::Convert(PF_R8G8B8); + Image colorImage(this->width, this->height, PF_R8G8B8); + void *data = colorImage.Data(); + Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); + this->RenderTarget()->copyContentsToMemory(ogrePixelBox); + // convert color image to bayer image + _image = gz::rendering::convertRGBToBayer(colorImage, _image.Format()); } else { imageFormat = OgreConversions::Convert(_image.Format()); + void *data = _image.Data(); + Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); + this->RenderTarget()->copyContentsToMemory(ogrePixelBox); } - - Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); - this->RenderTarget()->copyContentsToMemory(ogrePixelBox); - - if ((_image.Format() == PF_BAYER_RGGB8) || - (_image.Format() == PF_BAYER_BGGR8) || - (_image.Format() == PF_BAYER_GBRG8) || - (_image.Format() == PF_BAYER_GRBG8)) - { - Image destImage = gz::rendering::convertRGBToBayer(_image); - memcpy( _image.Data(), - destImage.Data(), - sizeof(unsigned char)*width*height); - } - } ////////////////////////////////////////////////// diff --git a/ogre2/src/Ogre2RenderTarget.cc b/ogre2/src/Ogre2RenderTarget.cc index b703ca40c..efa451665 100644 --- a/ogre2/src/Ogre2RenderTarget.cc +++ b/ogre2/src/Ogre2RenderTarget.cc @@ -399,20 +399,26 @@ void Ogre2RenderTarget::Copy(Image &_image) const static_cast(Ogre::PixelFormatGpuUtils::getSizeBytes( texture->getInternalWidth(), texture->getInternalHeight(), 1u, 1u, dstOgrePf, 1u))); - dstBox.data = _image.Data(); - Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, - dstOgrePf); if ((_image.Format() == PF_BAYER_RGGB8) || (_image.Format() == PF_BAYER_BGGR8) || (_image.Format() == PF_BAYER_GBRG8) || (_image.Format() == PF_BAYER_GRBG8)) { - Image destImage = gz::rendering::convertRGBToBayer(_image); - memcpy( _image.Data(), - destImage.Data(), - sizeof(unsigned char)*width*height); - } + // create tmp color image to get data from gpu + Image colorImage(this->width, this->height, PF_R8G8B8); + dstBox.data = colorImage.Data(); + Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, + dstOgrePf); + // convert color image to bayer image + _image = gz::rendering::convertRGBToBayer(colorImage, _image.Format()); + } + else + { + dstBox.data = _image.Data(); + Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, + dstOgrePf); + } } ////////////////////////////////////////////////// diff --git a/src/PixelFormat.cc b/src/PixelFormat.cc index 1f3cbf470..948f52683 100644 --- a/src/PixelFormat.cc +++ b/src/PixelFormat.cc @@ -52,13 +52,13 @@ const unsigned char PixelUtil::channelCounts[PF_COUNT] = // B8G8R8 3, // BAYER_RGGB8 - 4, + 1, // BAYER_BGGR8 - 4, + 1, // BAYER_GBRG8 - 4, + 1, // BAYER_GRBG8 - 4, + 1, // PF_FLOAT32_R 1, // PF_FLOAT32_RGBA diff --git a/src/Utils.cc b/src/Utils.cc index 5593acac0..f6ddcf396 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -252,17 +252,17 @@ gz::math::AxisAlignedBox transformAxisAlignedBox( } ///////////////////////////////////////////////// -Image convertRGBToBayer(Image &_image) +Image convertRGBToBayer(const Image &_image, PixelFormat _bayerFormat) { - unsigned char *sourceImageData = _image.Data(); + const unsigned char *sourceImageData = _image.Data(); unsigned int width = _image.Width(); unsigned int height = _image.Height(); - Image destImage(width, height, PF_L8); + Image destImage(width, height, _bayerFormat); unsigned char *destImageData = destImage.Data(); - if (_image.Format() == PF_BAYER_RGGB8) + if (_bayerFormat == PF_BAYER_RGGB8) { for (unsigned int i=0; i < width; i++) { @@ -294,7 +294,7 @@ Image convertRGBToBayer(Image &_image) } } - else if (_image.Format() == PF_BAYER_BGGR8) + else if (_bayerFormat == PF_BAYER_BGGR8) { for (unsigned int i=0; i < width; i++) { @@ -326,7 +326,7 @@ Image convertRGBToBayer(Image &_image) } } - else if (_image.Format() == PF_BAYER_GBRG8) + else if (_bayerFormat == PF_BAYER_GBRG8) { for (unsigned int i=0; i < width; i++) { @@ -358,7 +358,7 @@ Image convertRGBToBayer(Image &_image) } } - else if (_image.Format() == PF_BAYER_GRBG8) + else if (_bayerFormat == PF_BAYER_GRBG8) { for (unsigned int i=0; i < width; i++) { @@ -395,4 +395,4 @@ Image convertRGBToBayer(Image &_image) } } -} \ No newline at end of file +} From 544662496d87bf007e6f7d4e34646b5ac3497b8e Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Thu, 13 Apr 2023 21:25:20 +0000 Subject: [PATCH 8/9] line wrap Signed-off-by: Ian Chen --- ogre/src/OgreRenderTarget.cc | 6 ++++-- ogre2/src/Ogre2RenderTarget.cc | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ogre/src/OgreRenderTarget.cc b/ogre/src/OgreRenderTarget.cc index 3c9dbc272..0b961d8c8 100644 --- a/ogre/src/OgreRenderTarget.cc +++ b/ogre/src/OgreRenderTarget.cc @@ -92,7 +92,8 @@ void OgreRenderTarget::Copy(Image &_image) const imageFormat = OgreConversions::Convert(PF_R8G8B8); Image colorImage(this->width, this->height, PF_R8G8B8); void *data = colorImage.Data(); - Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); + Ogre::PixelBox ogrePixelBox( + this->width, this->height, 1, imageFormat, data); this->RenderTarget()->copyContentsToMemory(ogrePixelBox); // convert color image to bayer image _image = gz::rendering::convertRGBToBayer(colorImage, _image.Format()); @@ -101,7 +102,8 @@ void OgreRenderTarget::Copy(Image &_image) const { imageFormat = OgreConversions::Convert(_image.Format()); void *data = _image.Data(); - Ogre::PixelBox ogrePixelBox(this->width, this->height, 1, imageFormat, data); + Ogre::PixelBox ogrePixelBox( + this->width, this->height, 1, imageFormat, data); this->RenderTarget()->copyContentsToMemory(ogrePixelBox); } } diff --git a/ogre2/src/Ogre2RenderTarget.cc b/ogre2/src/Ogre2RenderTarget.cc index efa451665..f9209e637 100644 --- a/ogre2/src/Ogre2RenderTarget.cc +++ b/ogre2/src/Ogre2RenderTarget.cc @@ -408,16 +408,16 @@ void Ogre2RenderTarget::Copy(Image &_image) const // create tmp color image to get data from gpu Image colorImage(this->width, this->height, PF_R8G8B8); dstBox.data = colorImage.Data(); - Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, - dstOgrePf); + Ogre::Image2::copyContentsToMemory( + texture, texture->getEmptyBox(0u), dstBox, dstOgrePf); // convert color image to bayer image _image = gz::rendering::convertRGBToBayer(colorImage, _image.Format()); } else { dstBox.data = _image.Data(); - Ogre::Image2::copyContentsToMemory(texture, texture->getEmptyBox(0u), dstBox, - dstOgrePf); + Ogre::Image2::copyContentsToMemory( + texture, texture->getEmptyBox(0u), dstBox, dstOgrePf); } } From 54fec8b90dc50773aa2b92531ea2bfd09e174ae8 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Thu, 13 Apr 2023 22:06:42 +0000 Subject: [PATCH 9/9] fix doxygen format Signed-off-by: Ian Chen --- include/gz/rendering/Utils.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gz/rendering/Utils.hh b/include/gz/rendering/Utils.hh index 3233f9024..4d53fe2c9 100644 --- a/include/gz/rendering/Utils.hh +++ b/include/gz/rendering/Utils.hh @@ -116,7 +116,7 @@ namespace gz /// \brief convert an RGB image data into bayer image data /// \param[in] _image Input RGB image - /// \param[in] _bayer Bayer format to convert to + /// \param[in] _bayerFormat Bayer format to convert to /// \return Image in bayer format GZ_RENDERING_VISIBLE Image convertRGBToBayer(const Image &_image, PixelFormat _bayerFormat);