Go to the documentation of this file.00001 #include <pcl/pcl_config.h>
00002 #ifdef HAVE_OPENNI
00003
00004 #include <pcl/io/openni_camera/openni_image_rgb24.h>
00005
00006 namespace openni_wrapper
00007 {
00008 ImageRGB24::ImageRGB24 (boost::shared_ptr<xn::ImageMetaData> image_meta_data) throw ()
00009 : Image (image_meta_data)
00010 {
00011 }
00012
00013 ImageRGB24::~ImageRGB24 () throw ()
00014 {
00015 }
00016
00017 void ImageRGB24::fillGrayscale (unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step) const
00018 {
00019 if (width > image_md_->XRes () || height > image_md_->YRes ())
00020 THROW_OPENNI_EXCEPTION ("Up-sampling not supported. Request was %d x %d -> %d x %d.", image_md_->XRes (), image_md_->YRes (), width, height);
00021
00022 if (image_md_->XRes () % width == 0 && image_md_->YRes () % height == 0)
00023 {
00024 unsigned src_step = image_md_->XRes () / width;
00025 unsigned src_skip = (image_md_->YRes () / height - 1) * image_md_->XRes ();
00026
00027 if (gray_line_step == 0)
00028 gray_line_step = width;
00029
00030 unsigned dst_skip = gray_line_step - width;
00031
00032 unsigned char* dst_line = gray_buffer;
00033 const XnRGB24Pixel* src_line = image_md_->RGB24Data();
00034
00035 for (unsigned yIdx = 0; yIdx < height; ++yIdx, src_line += src_skip, dst_line += dst_skip)
00036 {
00037 for (unsigned xIdx = 0; xIdx < width; ++xIdx, src_line += src_step, dst_line ++)
00038 {
00039 *dst_line = static_cast<unsigned char>((static_cast<int> (src_line->nRed) * 299 +
00040 static_cast<int> (src_line->nGreen) * 587 +
00041 static_cast<int> (src_line->nBlue) * 114) * 0.001);
00042 }
00043 }
00044 }
00045 else
00046 {
00047 THROW_OPENNI_EXCEPTION ("Down-sampling only possible for integer scale. Request was %d x %d -> %d x %d.", image_md_->XRes (), image_md_->YRes (), width, height);
00048 }
00049 }
00050
00051 void ImageRGB24::fillRGB (unsigned width, unsigned height, unsigned char* rgb_buffer, unsigned rgb_line_step) const
00052 {
00053 if (width > image_md_->XRes () || height > image_md_->YRes ())
00054 THROW_OPENNI_EXCEPTION ("Up-sampling not supported. Request was %d x %d -> %d x %d.", image_md_->XRes (), image_md_->YRes (), width, height);
00055
00056 if (width == image_md_->XRes () && height == image_md_->YRes ())
00057 {
00058 unsigned line_size = width * 3;
00059 if (rgb_line_step == 0 || rgb_line_step == line_size)
00060 {
00061 memcpy (rgb_buffer, image_md_->Data(), image_md_->DataSize());
00062 }
00063 else
00064 {
00065 unsigned char* rgb_line = rgb_buffer;
00066 const unsigned char* src_line = static_cast<const unsigned char*> (image_md_->Data());
00067 for (unsigned yIdx = 0; yIdx < height; ++yIdx, rgb_line += rgb_line_step, src_line += line_size)
00068 {
00069 memcpy (rgb_line, src_line, line_size);
00070 }
00071 }
00072 }
00073 else if (image_md_->XRes () % width == 0 && image_md_->YRes () % height == 0)
00074 {
00075 unsigned src_step = image_md_->XRes () / width;
00076 unsigned src_skip = (image_md_->YRes () / height - 1) * image_md_->XRes ();
00077
00078 if (rgb_line_step == 0)
00079 rgb_line_step = width * 3;
00080
00081 unsigned dst_skip = rgb_line_step - width * 3;
00082
00083 XnRGB24Pixel* dst_line = reinterpret_cast<XnRGB24Pixel*> (rgb_buffer);
00084 const XnRGB24Pixel* src_line = image_md_->RGB24Data();
00085
00086 for (unsigned yIdx = 0; yIdx < height; ++yIdx, src_line += src_skip)
00087 {
00088 for (unsigned xIdx = 0; xIdx < width; ++xIdx, src_line += src_step, dst_line ++)
00089 {
00090 *dst_line = *src_line;
00091 }
00092
00093 if (dst_skip != 0)
00094 {
00095
00096 unsigned char* temp = reinterpret_cast <unsigned char*> (dst_line);
00097 dst_line = reinterpret_cast <XnRGB24Pixel*> (temp + dst_skip);
00098 }
00099 }
00100 }
00101 else
00102 {
00103 THROW_OPENNI_EXCEPTION ("Down-sampling only possible for integer scale. Request was %d x %d -> %d x %d.", image_md_->XRes (), image_md_->YRes (), width, height);
00104 }
00105 }
00106
00107 bool ImageRGB24::isResizingSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const
00108 {
00109 return ImageRGB24::resizingSupported (input_width, input_height, output_width, output_height);
00110 }
00111 }
00112
00113 #endif //HAVE_OPENNI
00114