Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

RawImageDataset.h

Go to the documentation of this file.
00001 #ifndef Impala_Application_Videolympics_RawImageDataset_h
00002 #define Impala_Application_Videolympics_RawImageDataset_h
00003 
00004 #include "Basis/ILog.h"
00005 
00006 #include "Core/Array/Arrays.h"
00007 #include "Core/Array/ReadFile.h"
00008 #include "Core/Array/ReadImage.h"
00009 #include "Core/Array/Set.h"
00010 #include "Core/Array/ArrayListDelete.h"
00011 
00012 namespace Impala {
00013 namespace Application {
00014 namespace Videolympics {
00015 
00016 using namespace Core::Array;
00017 
00018 class RawImageDataset
00019 {
00020 public:
00021     RawImageDataset(std::string fileName)
00022     {
00023         ILOG_DEBUG("reading dataset " << fileName << "...");
00024         mIOBuffer = new Util::IOBufferFile(fileName, true, false);
00025         ReadRawListVarIndex<Array2dScalarUInt8>(mFileOffset, mIOBuffer);
00026         ILOG_DEBUG("imageset loaded. " << NrImages() << " images available.");
00027     }
00028 
00029     int
00030     NrImages()
00031     {
00032         if (mIOBuffer)
00033             return mFileOffset.size();
00034         return mImages.size();
00035     }
00036 
00037     void
00038     RequestNext(int inc)
00039     {
00040         int newNr = mCurNr + inc;
00041         if (newNr < 0)
00042             newNr = 0;
00043         if (newNr >= NrImages())
00044             newNr = NrImages() - 1;
00045         if (newNr != mCurNr)
00046         {
00047             mCurNr = newNr;
00048         }
00049     }
00050 
00051     Array2dVec3UInt8*
00052     GetImage(int nr)
00053     {
00054         if (nr < 0 || nr > NrImages())
00055         {
00056             ILOG_WARN("request for image nr " << nr << ", only " << NrImages() << " in dataset.");
00057             return 0;
00058         }
00059 
00060         char buf[200];
00061         int width;
00062         int height;
00063         mIOBuffer->SetPosition(mFileOffset[nr]);
00064         mIOBuffer->Read(buf, 20);
00065         sscanf(buf, "%d %d ", &width, &height);
00066         size_t blockSize = width*height;
00067         char* data = new char[blockSize];
00068         size_t nrRead = mIOBuffer->Read(data, blockSize);
00069         if (nrRead != blockSize)
00070         {
00071             ILOG_ERROR("GetImage: read " << nrRead
00072                       << " bytes instead of " << blockSize);
00073         }
00074 
00075         Array2dVec3UInt8* image = 0;
00076 
00077         ReadImageFromMemory(image, data, blockSize);
00078         delete data;
00079 
00080         return image;
00081     }
00082 
00083 private:
00084 
00085     std::vector<Array2dVec3UInt8*> mImages;
00086     int                  mCurNr;
00087   
00088     // for file-based jpg/png archive
00089     Util::IOBuffer*      mIOBuffer;
00090     std::vector<Int64>   mFileOffset;
00091 
00092     ILOG_VAR_DEC;
00093 
00094 };
00095 ILOG_VAR_INIT(RawImageDataset, Application.Videolympics);
00096 
00097 }
00098 }
00099 }
00100 
00101 #endif
00102 
00103 
00104 /*class RawImageDataset
00105 {
00106 public:
00107     RawImageDataset(std::string fileName, std::string dispMode = "jpg")
00108     {
00109         ILOG_DEBUG("reading dataset " << fileName << "...");
00110         mDispMode = dispMode;
00111         mIOBuffer = new Util::IOBufferFile(fileName, true, false);
00112         ReadRawListVarIndex<Array2dScalarUInt8>(mFileOffset, mIOBuffer);
00113         mFileIm = 0;
00114         UpdateFileImage(0);
00115 
00116         mCurNr = -1;
00117         RequestNext(1);
00118 
00119         ILOG_DEBUG("imageset loaded. " << NrImages() << " images available.");
00120     }
00121 
00122     int
00123     NrImages()
00124     {
00125         if (mIOBuffer)
00126             return mFileOffset.size();
00127         return mImages.size();
00128     }
00129 
00130     int H() { return mFileIm->CH(); }
00131     int W() { return mFileIm->CW(); }
00132 
00133     void
00134     RequestNext(int inc)
00135     {
00136         int newNr = mCurNr + inc;
00137         if (newNr < 0)
00138             newNr = 0;
00139         if (newNr >= NrImages())
00140             newNr = NrImages() - 1;
00141         if (newNr != mCurNr)
00142         {
00143             mCurNr = newNr;
00144         }
00145     }
00146 
00147     Array2dVec3UInt8*
00148     GetImage(int nr)
00149     {
00150         if (nr < 0 || nr > NrImages())
00151         {
00152             ILOG_WARN("request for image nr " << nr << ", only " << NrImages() << " in dataset.");
00153             return 0;
00154         }
00155         UpdateFileImage(nr);
00156         return mFileIm;
00157     }
00158 
00159 private:
00160     void
00161     UpdateFileImage(int nr)
00162     {
00163         char buf[200];
00164         int width;
00165         int height;
00166         mIOBuffer->SetPosition(mFileOffset[nr]);
00167         mIOBuffer->Read(buf, 20);
00168         sscanf(buf, "%d %d ", &width, &height);
00169         size_t blockSize = width*height;
00170         char* data = new char[blockSize];
00171         size_t nrRead = mIOBuffer->Read(data, blockSize);
00172         if (nrRead != blockSize)
00173             std::cout << "UpdateFileImage: read " << nrRead
00174                       << " bytes instead of " << blockSize << std::endl;
00175         if (mFileIm)
00176             delete mFileIm;
00177         mFileIm = 0;
00178         if (mDispMode == std::string("jpg"))
00179             ReadJpgFromMemory(mFileIm, data, blockSize);
00180         else
00181             ReadPngFromMemory(mFileIm, data, blockSize);
00182         delete data;
00183     }
00184 
00185     std::vector<Array2dVec3UInt8*> mImages;
00186     int                  mCurNr;
00187     std::string          mDispMode;
00188 
00189     // for file-based jpg/png archive
00190     Util::IOBuffer*      mIOBuffer;
00191     std::vector<Int64>   mFileOffset;
00192     Array2dVec3UInt8*    mFileIm;
00193 
00194 */

Generated on Fri Mar 19 09:30:41 2010 for ImpalaSrc by  doxygen 1.5.1