Open Source Computer Vision Library https://opencv.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

170 lines
5.3 KiB

#include <ctime>
#include <stringstream>
using namespace std;
using namespace cv;
const char* day[] = { "Sun", "Mon", "Tue", "Wed", "Thurs", "Fri", "Sat" };
const char* month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
const char* arch = "${MEX_ARCH}";
// ----------------------------------------------------------------------------
// BASIC OPERATIONS
// ----------------------------------------------------------------------------
string MatlabIO::filename(void) const { return filename_; }
bool open(const string& filename, ios_base::openmode mode);
filename_ = filename;
stream_.open(filename, mode);
}
bool isOpen() const { return stream_.valid(); }
void close() { stream_.close(); }
std::ifstream::pos_type filesize() {
std::ifstream::pos_type current = stream_.tellg();
stream_.seekg(0, std::ifstream::end);
std::ifstream::pos_type end = stream_.tellg();
stream_.seekg(current, std::ifstream::beg);
return end;
}
void pushStreamPosition() {
stream_pos_ = stream_.tellg();
}
void popStreamPosition() {
stream_.seekg(stream_pos_, std::ifstream::beg);
}
void setStreamPosition(std::ifstream::pos_type position) {
stream_.seekg(position, std::ifstream::beg);
}
// ----------------------------------------------------------------------------
// HEADERS
// ----------------------------------------------------------------------------
void getFileHeader() {
// store the current stream position
pushStreamPosition();
setStreamPosition(0);
stream_.read(const_cast<char *>(header_.data()), sizeof(char)*HEADER_LENGTH);
stream_.read(const_cast<char *>(subsys_.data()), sizeof(char)*SUBSYS_LENGTH);
stream_.read((char *)&version_, sizeof(int16_t));
stream_.read(const_cast<char *>(endian_.data()), sizeof(char)*ENDIAN_LENGTH);
// get the actual version
if (version_ == 0x0100) version_ = Matlab::IO::Version5;
if (version_ == 0x0200) version_ = Matlab::IO::Version73;
// get the endianness
if (endian_.compare("IM") == 0) byte_swap_ = false;
if (endian_.compare("MI") == 0) byte_swap_ = true;
// restore the current stream position
popStreamPosition();
}
// ----------------------------------------------------------------------------
// INDEXING OPERATIONS
// ----------------------------------------------------------------------------
void MatlabIO::indexNode(const MappingIndex& current) {
}
void MatlabIO::indexNode(const SequenceIndex& current) {
}
void MatlabIO::index() {
// if there is no open file, do nothing
if (!isOpen()) return;
// read the global header
getFileHeader();
// change the endianness if need be
// manually index the top-level node
MappingIndex root(filename_, vector<size_t>(), stream_.tellg(), filesize(), 0, 0, stream_);
indexNode(root);
index_ = root;
}
// ----------------------------------------------------------------------------
// FORMATTING / PRINTING
// ----------------------------------------------------------------------------
template <typename Iterable>
string delimitedStringFromIterable(const Iterable& obj, const string& delimiter=string(" ")) {
string cache = "";
ostringstream oss;
for (Iterable::iterator it = obj.begin(); it != obj.end(); ++it) {
// flush the cache and insert the next element
oss << cache << *it;
cache = delimiter;
}
return oss.str();
}
string formatCurrentTime() {
ostringstream oss;
time_t rawtime;
struct tm* timeinfo;
int dom, hour, min, sec, year;
// compute the current time
time(&rawtime);
timeinfo = localtime(&rawtime);
// extract the components of interest
dom = timeinfo->tm_mday;
hour = timeinfo->tm_hour;
min = timeinfo->tm_min;
sec = timeinfo->tm_sec;
year = timeinfo->year + 1900;
oss << day[timeinfo->tm_wday] << " " << month[timeinfo->tm_mon]
<< " " << dom << " " << hour << ":" << min << ":" << sec << " " << year;
return oss.str();
}
void MatlabIO::printRootIndex() const {
cout << "--------------- top level file index ------------------" << endl;
cout << "Filename: " << filename() << endl;
cout << "File size: " << filesize() << "MB" << endl << endl;
cout << "Name size bytes type" << endl;
for (Map<String, Index>::iterator it = index_.mapping.begin(); it != index_.mapping.end(); ++it) {
cout << it->name << " ";
cout << delimitedStringFromIterable(it->size, "x") << " ";
cout << it->end - it->begin << " ";
cout << endl;
}
cout << "-------------------------------------------------------" << endl;
}
void printIndex(const Index& index, const int indentation) {
cout << string(2*indentation - 1, ' ') << "|" << endl;
cout << string(2*indentation - 1, ' ') << "|-- ";
cout << index.name << " (" << delimitedStringFromIterable(index.size, "x") << ")" << endl;
if (index.leaf) return;
if (index.associative) {
for (Map<string, Index>::iterator it = index.mapping.begin(); it != index.mapping.end(); ++it) {
printIndex(it->second, indentation+1);
}
} else {
for (vector<Index>::iterator it = index.sequence.begin(); it != index.sequence.end(); ++it) {
printIndex(it->second, indentation+1);
}
}
}
void MatlabIO::printFullIndex() const {
int indentation = 0;
cout << "----------------- full file index ---------------------" << endl;
printIndex(index_, indentation);
cout << "-------------------------------------------------------" << endl;
}