25 #ifndef INCLUDED_LoadRows_h_GUID_7FC43F97_8922_448D_7CE8_2D9EAB669BBD 
   26 #define INCLUDED_LoadRows_h_GUID_7FC43F97_8922_448D_7CE8_2D9EAB669BBD 
   40 #include <Eigen/Geometry> 
   41 #include <opencv2/core/core.hpp> 
   55     static const cv::Size IMAGE_SIZE = {640, 480};
 
   57     inline cv::Mat 
const &getGray() {
 
   58         static const cv::Mat instance = cv::Mat(IMAGE_SIZE, CV_8UC1);
 
   62     inline cv::Mat 
const &getColor() {
 
   63         static const cv::Mat instance = cv::Mat(IMAGE_SIZE, CV_8UC3);
 
   71             : helper_(helper), row_(row) {}
 
   73             if (!measurementPieces_.empty()) {
 
   74                 std::cerr << 
"Leftover measurement pieces on loadrow " 
   75                              "destruction, suggests a parsing error!" 
   79         bool operator()(std::string 
const &line, std::size_t beginPos,
 
   81             auto advanceFieldAfterProcessing = 
util::finally([&] { field_++; });
 
   89                 std::tie(success, val) = helper_.getFieldAs<
double>(strField);
 
   93                 row_.xlate[field_] = val;
 
  100                 std::tie(success, val) = helper_.getFieldAs<
double>(strField);
 
  122                 auto success = helper_.getField(strField, row_.tv.seconds);
 
  127                 auto success = helper_.getField(strField, row_.tv.microseconds);
 
  135             bool success = 
false;
 
  137             std::tie(success, val) = helper_.getFieldAs<
float>(strField);
 
  141             measurementPieces_.push_back(val);
 
  142             if (measurementPieces_.size() == 3) {
 
  144                 row_.measurements.emplace_back(
 
  145                     measurementPieces_[0], measurementPieces_[1],
 
  146                     measurementPieces_[2], IMAGE_SIZE);
 
  147                 measurementPieces_.clear();
 
  155         std::size_t field_ = 0;
 
  156         std::vector<float> measurementPieces_;
 
  159     inline MeasurementsRows loadData(std::string 
const &fn) {
 
  160         MeasurementsRows ret;
 
  161         std::ifstream csvFile(fn);
 
  163             std::cerr << 
"Could not open csvFile " << fn << std::endl;
 
  167             auto headerRow = csvtools::getCleanLine(csvFile);
 
  168             if (headerRow.empty() || !csvFile) {
 
  171                 std::cerr << 
"Header row was empty, that's not a good sign!" 
  178         std::string dataLine = csvtools::getCleanLine(csvFile);
 
  180             TimestampedMeasurementsPtr newRow(
new TimestampedMeasurements);
 
  181             csvtools::iterateFields(LoadRow(helper, *newRow), dataLine);
 
  185                 std::cout << 
"Row has " << newRow->measurements.size()
 
  186                           << 
" blobs" << std::endl;
 
  188                 ret.emplace_back(std::move(newRow));
 
  190                 std::cerr << 
"Something went wrong parsing that row: " 
  191                           << dataLine << std::endl;
 
  194             dataLine = csvtools::getCleanLine(csvFile);
 
  196         std::cout << 
"Total of " << ret.size() << 
" rows" << std::endl;
 
  201     makeImageOutputDataFromRow(TimestampedMeasurements 
const &row,
 
  202                                CameraParameters 
const &camParams) {
 
  203         ImageOutputDataPtr ret(
new ImageProcessingOutput);
 
  205         ret->ledMeasurements = row.measurements;
 
  206         ret->camParams = camParams;
 
  207         ret->frame = getColor();
 
  208         ret->frameGray = getGray();
 
  215 #endif // INCLUDED_LoadRows_h_GUID_7FC43F97_8922_448D_7CE8_2D9EAB669BBD 
Header declaring a C++11 finally or "scope-guard" construct. 
Header providing a C++ wrapper around TimeValueC.h. 
FinalTask< F > finally(F &&f)