35 #ifndef SHARK_DATA_IMPORT_PGM_H 36 #define SHARK_DATA_IMPORT_PGM_H 43 #include <boost/format.hpp> 44 #include <boost/filesystem.hpp> 45 #include <boost/archive/text_oarchive.hpp> 54 void importPGM( std::string
const& fileName,
unsigned char ** ppData,
int & sx,
int & sy )
56 FILE * fp = fopen(fileName.c_str(),
"rb");
58 if( !fp )
throw SHARKEXCEPTION(
"[importPGM] cannot open file: " + fileName);
61 const int nParamRead0 = fscanf(fp,
"%s\n", (
char *) &format);
62 if ( 0 == nParamRead0 )
throw SHARKEXCEPTION(
"[importPGM] error reading file: " + fileName );
67 fgetpos (fp, &position);
69 char *s = fgets( tmpCharBuf, 255, fp );
70 if (!s)
throw SHARKEXCEPTION(
"[importPGM] error reading file: " + fileName );
71 const int cnt = strncmp( tmpCharBuf,
"#", 1 );
73 fsetpos(fp, &position);
76 fgetpos (fp, &position);
81 const int nParamRead1 = fscanf( fp,
"%d %d\n", &sx, &sy );
82 const int nParamRead2 = fscanf( fp,
"%d\n", &nGrayValues );
84 if ( (nParamRead1 != 2) || (nParamRead2 != 1) ) {
86 throw SHARKEXCEPTION(
"[importPGM] file corrupted or format not recognized in file: " + fileName );
88 if ( (0 == strncmp(
"P5", format, 2)) && ( (255 == nGrayValues) || (256 == nGrayValues) ) ) {
90 *ppData =
new unsigned char[sx*sy];
91 fseek(fp, -sx*sy*
sizeof(
unsigned char), SEEK_END);
93 const int readcount = (int)( fread(*ppData, sx*
sizeof(
unsigned char), sy, fp));
94 if (sy != readcount) {
96 throw SHARKEXCEPTION(
"[importPGM] file corrupted or format not recognized in file: " + fileName );
100 throw SHARKEXCEPTION(
"[importPGM] file corrupted or format not recognized in file: " + fileName );
118 void writePGM( std::string
const& fileName,
unsigned char const* pData, std::size_t sx, std::size_t sy )
120 FILE* fp = fopen(fileName.c_str(),
"wb");
121 if( !fp )
throw SHARKEXCEPTION(
"[writePGM] cannot open file: " + fileName);
124 fprintf(fp,
"%d %d\n255\n", (
int)sx, (
int)sy);
126 if( 1 != fwrite(pData, sx*sy, 1, fp) ) {
128 throw SHARKEXCEPTION(
"[writePGM] can not write data to file: "+ fileName );
141 void importPGM( std::string
const& fileName, T& data, std::size_t& sx, std::size_t& sy ) {
142 unsigned char *pData;
147 sx = std::size_t(isx);
148 sy = std::size_t(isy);
150 std::copy(pData, pData + sx*sy, data.begin());
162 void exportPGM(std::string
const& fileName, T
const& data, std::size_t sx, std::size_t sy,
bool normalize =
false) {
164 unsigned char *pData =
new unsigned char[data.size()];
165 typename T::const_iterator it = data.begin();
167 double lb = *std::min_element(data.begin(),data.end());
168 double ub = *std::max_element(data.begin(), data.end());
169 for( it = data.begin() ; it != data.end(); ++it, ++i )
170 pData[i] = (
unsigned char)( (*it - lb) / (ub - lb) * 255 );
172 for( it = data.begin() ; it != data.end(); ++it, ++i )
173 pData[i] = (
unsigned char)( *it );
175 detail::writePGM(fileName, pData, sx, sy);
190 inline void exportFiltersToPGMGrid(std::string
const& basename, RealMatrix
const& filters,std::size_t width, std::size_t height) {
193 std::size_t gridX = std::size_t(std::sqrt(
double(filters.size1())));
194 std::size_t gridY = gridX;
195 while(gridX*gridY < filters.size1()) ++gridX;
197 RealMatrix image((height+1)*gridY,(width+1)*gridX,
min(filters));
199 for(std::size_t filter = 0; filter != filters.size1(); ++filter){
201 std::size_t i = filter/gridX;
202 std::size_t j = filter%gridX;
203 std::size_t startY = (height+1)*i;
204 std::size_t startX = (width+1)*j;
209 (basename+
".pgm").c_str(),
211 (width+1)*gridX, (height+1)*gridY,
231 std::size_t gridX = std::size_t(std::sqrt(
double(numFilters)));
232 std::size_t gridY = gridX;
233 while(gridX*gridY < numFilters) ++gridX;
240 RealMatrix image((height+1)*gridY,(width+1)*gridX,minimum);
242 for(std::size_t filter = 0; filter != numFilters; ++filter){
244 std::size_t i = filter/gridX;
245 std::size_t j = filter%gridX;
246 std::size_t startY = (height+1)*i;
247 std::size_t startX = (width+1)*j;
248 RealVector filterImage =filters.
element(filter);
253 (basename+
".pgm").c_str(),
255 (width+1)*gridX, (height+1)*gridY,
267 template<
typename Archive>
281 void importPGMDir(
const std::string &p, T &container, std::vector<ImageInformation> &info)
283 typedef typename T::value_type
InputType;
286 if (boost::filesystem::is_directory(p)) {
287 for (boost::filesystem::recursive_directory_iterator itr(p); itr!=boost::filesystem::recursive_directory_iterator(); ++itr) {
288 if (boost::filesystem::is_regular(itr->status())) {
289 if ((boost::filesystem::extension(itr->path()) ==
".PGM") ||
290 (boost::filesystem::extension(itr->path()) ==
".pgm")) {
293 importPGM(itr->path().string().c_str(), img, imgInfo.
x, imgInfo.
y);
294 imgInfo.
name = itr->path().filename().string().c_str();
295 container.push_back(img);
296 info.push_back(imgInfo);
301 throw( std::invalid_argument(
"[importPGMDir] cannot open file" ) );
314 std::vector<ImageInformation> tmpInfo;