photo_image.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * Software License Agreement (BSD License)
4  *
5  * Copyright (c) 2012, Robert Bosch LLC.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of the Robert Bosch nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  *********************************************************************/
36 #include <opencv2/core/core.hpp>
37 #include <opencv2/highgui/highgui.hpp>
38 
39 #include <iostream>
40 
41 #include <photo/photo_image.hpp>
42 
44  width_(0),
45  height_(0),
46  bytes_per_pixel_(3),
47  image_size_(0),
48  data_(NULL)
49 {
50 }
51 
53 {
54  delete[] data_; // delete on a NULL pointer has no effect, so this will work if data_ points to an image or not
55 }
56 
57 
59 {
60  return width_;
61 }
62 
64 {
65  return height_;
66 }
67 
69 {
70  return bytes_per_pixel_;
71 }
72 
74 {
75  return image_size_;
76 }
77 
79 {
80  return data_;
81 }
82 
83 //* sets size and allocates memory for image data
84 void photo_image::photo_image_set_size( int image_width, int image_height, size_t image_bytes_per_pixel )
85 {
86  delete[] data_; // delete on a NULL pointer has no effect
87 
88  width_ = image_width;
89  height_ = image_height;
90  bytes_per_pixel_ = image_bytes_per_pixel;
92 
93  data_ = new char[image_size_](); // create array and initialize to default value: 0
94 }
95 
96 //* reads an image from filesystem
97 bool photo_image::photo_image_read( const std::string& filename )
98 {
99  int r, c;
100  // Read image from file using OpenCV
101  cv::Mat img = cv::imread( filename.c_str() );
102  if( img.empty() )
103  {
104  std::cerr << "img.empty() == true" << std::endl;
105  return false;
106  }
107 
108  int w = img.cols;
109  int h = img.rows;
110 
111 
112  //int chan = img.channels(); // number of data channels, ex: 3 for RGB
113  int d = img.elemSize(); // bytes per element: 1 element has 'chan' channels of data
114 
115  // Store image in photo_image
116  if( width_ != w || height_ != h )
117  {
118  //std::cout << "Setting size to " << w << " x " << h << " x " << d << ".";
119  photo_image_set_size( w, h, d );
120  }
121 
122  size_t n = 0; // counter for iterating over data_
123  for( r = 0; r < height_; ++r )
124  {
125  for( c = 0; c < width_; ++c )
126  {
127  // This assumes the image is 24-bit RGB. Needs improvement to handle other image types.
128  const cv::Vec3b& pixel = img.at<cv::Vec3b>(r, c);
129 
130  uint8_t R = pixel[2]; // Red
131  uint8_t G = pixel[1]; // Green
132  uint8_t B = pixel[0]; // Blue
133 
134  data_[n++] = R; // R
135  data_[n++] = G; // G
136  data_[n++] = B; // B
137  }
138  }
139  return true;
140 }
141 
142 //* writes an image to filesystem
143 bool photo_image::photo_image_write( const std::string& filename )
144 {
145  int r, c;
146 
147  // Create OpenCV image for 24-bit RGB
148  cv::Mat img (height_, width_, CV_8UC3);
149 
150  int n = 0;
151  for( r = 0; r < height_; ++r )
152  {
153  for( c = 0; c < width_; ++c )
154  {
155  img.at<unsigned char> (r, 3*c+2) = data_[n++]; // Red
156  img.at<unsigned char> (r, 3*c+1) = data_[n++]; // Green
157  img.at<unsigned char> (r, 3*c+0) = data_[n++]; // Blue
158  }
159  }
160  cv::imwrite( filename.c_str(), img );
161  return true;
162 }
d
bool photo_image_write(const std::string &filename)
void photo_image_set_size(int image_width, int image_height, size_t image_bytes_per_pixel)
Definition: photo_image.cpp:84
bool photo_image_read(const std::string &filename)
Definition: photo_image.cpp:97
size_t bytes_per_pixel_
Definition: photo_image.hpp:46
photo_image(void)
Definition: photo_image.cpp:43
int getHeight(void)
Definition: photo_image.cpp:63
~photo_image(void)
Definition: photo_image.cpp:52
int getWidth(void)
Definition: photo_image.cpp:58
char * getDataAddress(void)
Definition: photo_image.cpp:78
char * data_
Definition: photo_image.hpp:48
size_t getBytesPerPixel(void)
Definition: photo_image.cpp:68
size_t getImageSize(void)
Definition: photo_image.cpp:73
size_t image_size_
Definition: photo_image.hpp:47


photo
Author(s): Benjamin Pitzer
autogenerated on Mon Feb 28 2022 23:12:30