00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "rtc/rtcImage.h"
00024
00025
00026 namespace rtc {
00027
00028
00029 template <>
00030 bool Image<Vec3uc>::readFromFile(const char* filename)
00031 {
00032 cv::Mat img = cv::imread(filename);
00033 if(img.empty()) return false;
00034 int w = img.cols;
00035 int h = img.rows;
00036 setSize(h,w);
00037 for(int r=0;r<h;++r)
00038 {
00039 for(int c=0;c<w;++c)
00040 {
00041 x[r*w+c][0] = img.at<Vec3b> (r, c)[2];
00042 x[r*w+c][1] = img.at<Vec3b> (r, c)[1];
00043 x[r*w+c][2] = img.at<Vec3b> (r, c)[0];
00044 }
00045 }
00046 return true;
00047 }
00048
00049 template <>
00050 bool Image<Vec4uc>::readFromFile(const char* filename)
00051 {
00052 cv::Mat img = cv::imread(filename);
00053 if(img.empty()) return false;
00054 int w = img.cols;
00055 int h = img.rows;
00056 setSize(h,w);
00057 for(int r=0;r<h;++r)
00058 {
00059 for(int c=0;c<w;++c)
00060 {
00061 x[r*w+c][0] = img.at<Vec3b> (r, c)[2];
00062 x[r*w+c][1] = img.at<Vec3b> (r, c)[1];
00063 x[r*w+c][2] = img.at<Vec3b> (r, c)[0];
00064 x[r*w+c][3] = (uchar)(255);
00065 }
00066 }
00067 return true;
00068 }
00069
00070 template <>
00071 bool Image<float>::readFromFile(const char* filename)
00072 {
00073 cv::Mat img = cv::imread(filename);
00074 if(img.empty()) return false;
00075 int w = img.cols;
00076 int h = img.rows;
00077 setSize(h,w);
00078 for(int r=0;r<h;++r)
00079 {
00080 for(int c=0;c<w;++c)
00081 {
00082 uchar R = img.at<Vec3b> (r, c)[2];
00083 uchar G = img.at<Vec3b> (r, c)[1];
00084 uchar B = img.at<Vec3b> (r, c)[0];
00085 x[r*w+c] = (R*0.299+G*0.587+B*0.114)/256.0;
00086 }
00087 }
00088 return true;
00089 }
00090
00091 template <>
00092 bool Image<unsigned char>::readFromFile(const char* filename)
00093 {
00094 cv::Mat img = cv::imread(filename);
00095 if(img.empty()) return false;
00096 int w = img.cols;
00097 int h = img.rows;
00098 setSize(h,w);
00099 for(int r=0;r<h;++r)
00100 {
00101 for(int c=0;c<w;++c)
00102 {
00103 uchar R = img.at<Vec3b> (r, c)[2];
00104 uchar G = img.at<Vec3b> (r, c)[1];
00105 uchar B = img.at<Vec3b> (r, c)[0];
00106 x[r*w+c] = R*0.299+G*0.587+B*0.114;
00107 }
00108 }
00109 return true;
00110 }
00111
00112 template <>
00113 bool Image<Vec3uc>::writeToFile(const char* filename) const
00114 {
00115 int w = columns();
00116 int h = rows();
00117 cv::Mat image (h, w, CV_8UC3);
00118 for(int r=0;r<h;++r)
00119 {
00120 for(int c=0;c<w;++c)
00121 {
00122 image.at<unsigned char> (r, 3*c+2) = x[r*w+c][0];
00123 image.at<unsigned char> (r, 3*c+1) = x[r*w+c][1];
00124 image.at<unsigned char> (r, 3*c) = x[r*w+c][2];
00125 }
00126 }
00127 cv::imwrite(filename, image);
00128 return true;
00129 }
00130
00131 template <>
00132 bool Image<Vec4uc>::writeToFile(const char* filename) const
00133 {
00134 int w = columns();
00135 int h = rows();
00136
00137
00138 cv::Mat img (h, w, CV_8UC4);
00139 for(int r=0;r<h;++r)
00140 {
00141 for(int c=0;c<w;++c)
00142 {
00143 img.at<Vec3b> (r, c)[2] = x[r*w+c][0];
00144 img.at<Vec3b> (r, c)[1] = x[r*w+c][1];
00145 img.at<Vec3b> (r, c)[0] = x[r*w+c][2];
00146 img.at<Vec3b> (r, c)[4] = x[r*w+c][3];
00147 }
00148 }
00149 cv::imwrite(filename, img);
00150 return true;
00151 }
00152
00153 template <>
00154 bool Image<float>::writeToFile(const char* filename) const
00155 {
00156 int w = columns();
00157 int h = rows();
00158 CvSize size = {w,h};
00159 cv::Mat img (size,IPL_DEPTH_8U,1);
00160 for(int r=0;r<h;++r)
00161 {
00162 for(int c=0;c<w;++c)
00163 {
00164 img.at<float> (r, c) = rtc_clamp<int>(at(r,c)*256,0,255);
00165 }
00166 }
00167 return true;
00168 }
00169
00170 template <>
00171 bool Image<unsigned char>::writeToFile(const char* filename) const
00172 {
00173 int w = columns();
00174 int h = rows();
00175 CvSize size = {w,h};
00176 cv::Mat img (size,IPL_DEPTH_8U,1);
00177 for(int r=0;r<h;++r)
00178 {
00179 for(int c=0;c<w;++c)
00180 {
00181 img.at<unsigned char> (r, c) = at(r,c);
00182 }
00183 }
00184 return true;
00185 }
00190 template <>
00191 Image<Vec3uc>::Pixel Image<Vec3uc>::interpolate(const float row, const float col) const
00192 {
00193 const int truncR = rtc_clamp(static_cast<int>(row),0,rows()-1);
00194 const int truncR1 = rtc_clamp(truncR+1,0,rows()-1);
00195 const float fractR = row - static_cast<float>(truncR);
00196 const int truncC = rtc_clamp(static_cast<int>(col),0,columns()-1);
00197 const int truncC1 = rtc_clamp(truncC+1,0,columns()-1);
00198 const float fractC = col - static_cast<float>(truncC);
00199
00200
00201 const Vec3f syx = at(truncR,truncC);
00202 const Vec3f syx1 = at(truncR,truncC1);
00203 const Vec3f sy1x = at(truncR1,truncC);
00204 const Vec3f sy1x1 = at(truncR1,truncC1);
00205
00206 const Vec3f tmp1 = syx + (syx1-syx)*fractC;
00207 const Vec3f tmp2 = sy1x + (sy1x1-sy1x)*fractC;
00208 return (tmp1 + (tmp2-tmp1)*fractR);
00209 }
00210
00211 template <>
00212 Image<Vec4uc>::Pixel Image<Vec4uc>::interpolate(const float row, const float col) const
00213 {
00214 const int truncR = rtc_clamp(static_cast<int>(row),0,rows()-1);
00215 const int truncR1 = rtc_clamp(truncR+1,0,rows()-1);
00216 const float fractR = row - static_cast<float>(truncR);
00217 const int truncC = rtc_clamp(static_cast<int>(col),0,columns()-1);
00218 const int truncC1 = rtc_clamp(truncC+1,0,columns()-1);
00219 const float fractC = col - static_cast<float>(truncC);
00220
00221
00222 const Vec4f syx = at(truncR,truncC);
00223 const Vec4f syx1 = at(truncR,truncC1);
00224 const Vec4f sy1x = at(truncR1,truncC);
00225 const Vec4f sy1x1 = at(truncR1,truncC1);
00226
00227 const Vec4f tmp1 = syx + (syx1-syx)*fractC;
00228 const Vec4f tmp2 = sy1x + (sy1x1-sy1x)*fractC;
00229 return (tmp1 + (tmp2-tmp1)*fractR);
00230 }
00231
00232 template <>
00233 Image<float>::Pixel Image<float>::interpolate(const float row, const float col) const
00234 {
00235 const int truncR = rtc_clamp(static_cast<int>(row),0,rows()-1);
00236 const int truncR1 = rtc_clamp(truncR+1,0,rows()-1);
00237 const float fractR = row - static_cast<float>(truncR);
00238 const int truncC = rtc_clamp(static_cast<int>(col),0,columns()-1);
00239 const int truncC1 = rtc_clamp(truncC+1,0,columns()-1);
00240 const float fractC = col - static_cast<float>(truncC);
00241
00242
00243 const float syx = at(truncR,truncC);
00244 const float syx1 = at(truncR,truncC1);
00245 const float sy1x = at(truncR1,truncC);
00246 const float sy1x1 = at(truncR1,truncC1);
00247
00248 const float tmp1 = syx + (syx1-syx)*fractC;
00249 const float tmp2 = sy1x + (sy1x1-sy1x)*fractC;
00250 return (tmp1 + (tmp2-tmp1)*fractR);
00251 }
00252
00253 template <>
00254 Image<unsigned char>::Pixel Image<unsigned char>::interpolate(const float row, const float col) const
00255 {
00256 const int truncR = rtc_clamp(static_cast<int>(row),0,rows()-1);
00257 const int truncR1 = rtc_clamp(truncR+1,0,rows()-1);
00258 const float fractR = row - static_cast<float>(truncR);
00259 const int truncC = rtc_clamp(static_cast<int>(col),0,columns()-1);
00260 const int truncC1 = rtc_clamp(truncC+1,0,columns()-1);
00261 const float fractC = col - static_cast<float>(truncC);
00262
00263
00264 const float syx = at(truncR,truncC);
00265 const float syx1 = at(truncR,truncC1);
00266 const float sy1x = at(truncR1,truncC);
00267 const float sy1x1 = at(truncR1,truncC1);
00268
00269 const float tmp1 = syx + (syx1-syx)*fractC;
00270 const float tmp2 = sy1x + (sy1x1-sy1x)*fractC;
00271 return (unsigned char)(tmp1 + (tmp2-tmp1)*fractR);
00272 }
00273
00274 template <>
00275 bool Image<Vec3uc>::fromOpenCV(const cv::Mat& image)
00276 {
00277 int w = image.cols;
00278 int h = image.rows;
00279 setSize(h,w);
00280 for(int r=0;r<h;++r)
00281 {
00282 for(int c=0;c<w;++c)
00283 {
00284 x[r*w+c][0] = image.at<Vec3b> (r, c)[2];
00285 x[r*w+c][1] = image.at<Vec3b> (r, c)[1];
00286 x[r*w+c][2] = image.at<Vec3b> (r, c)[0];
00287 }
00288 }
00289 return true;
00290 }
00291
00292 template <>
00293 bool Image<Vec4uc>::fromOpenCV(const cv::Mat& image)
00294 {
00295 int w = image.cols;
00296 int h = image.rows;
00297 setSize(h,w);
00298 for(int r=0;r<h;++r)
00299 {
00300 for(int c=0;c<w;++c)
00301 {
00302 x[r*w+c][0] = image.at<Vec3b> (r, c)[2];
00303 x[r*w+c][1] = image.at<Vec3b> (r, c)[1];
00304 x[r*w+c][2] = image.at<Vec3b> (r, c)[0];
00305 x[r*w+c][3] = (uchar)(255);
00306 }
00307 }
00308 return true;
00309 }
00310
00311
00312 template <>
00313 bool Image<Vec3uc>::toOpenCV(cv::Mat& image) const
00314 {
00315 int w = columns();
00316 int h = rows();
00317 image.create(h, w, CV_8UC3);
00318 for(int r=0;r<h;++r)
00319 {
00320 for(int c=0;c<w;++c)
00321 {
00322 image.at<unsigned char> (r, 3*c+2) = x[r*w+c][0];
00323 image.at<unsigned char> (r, 3*c+1) = x[r*w+c][1];
00324 image.at<unsigned char> (r, 3*c) = x[r*w+c][2];
00325 }
00326 }
00327 return true;
00328 }
00329
00330 }
00331