Exemple #1
0
int main(int argc, char **argv) {

  int c;
  static struct option longopts[] = {
    {"feature",required_argument,NULL,'f'},
  };
  char *fep = NULL;
  while((c = getopt_long(argc,argv,"f:",longopts,NULL)) != -1) {
    switch(c) {
      case 'f':
        fep = optarg;
        break;
      case '?':
        usage();
        break;
    }
  }
  if(!fep) {
    usage();
  }

  feature_obj *fo = feature_reader_create(fep);
  if(!fo) {
    printf("Sorry: unable to create a feature reader object from the file path %s\n",fep);
  }
  char *formatters[2] = { "iPhone","Android"};
  int res = csv_writer(fo,formatters,2);
  return 0;
}
TEST(CsvWriter, TestWriteLine) {

  // Write a bunch of lines to a csv file.
  CsvWriter csv_writer(csv_write_file);
  EXPECT_TRUE(csv_writer.IsOpen());

  std::vector<int> line1 = {1, 2, 3, 4, 5};
  std::vector<double> line2 = {6.0, 7.0, 8.0, 9.0, 10.0};
  std::vector<std::string> line3 = {"a", "b", "c", "d", "e"};
  Eigen::Matrix<double, 5, 1> line4;
  line4 << 11.0, 12.0, 13.0, 14.0, 15.0;

  EXPECT_TRUE(csv_writer.WriteLine(line1));
  EXPECT_TRUE(csv_writer.WriteLine(line2));
  EXPECT_TRUE(csv_writer.WriteLine(line3));
  EXPECT_TRUE(csv_writer.WriteLine(line4));
  EXPECT_TRUE(csv_writer.Close());

  // Read back the lines from the csv file.
  CsvReader csv_reader(csv_write_file);
  EXPECT_TRUE(csv_reader.IsOpen());
  EXPECT_TRUE(csv_reader.HasMoreLines());

  // First line.
  std::vector<std::string> tokenized_line;
  EXPECT_TRUE(csv_reader.ReadLine(&tokenized_line));
  EXPECT_EQ(line1.size(), tokenized_line.size());
  for (size_t ii = 0; ii < tokenized_line.size(); ++ii) {
    EXPECT_EQ(line1[ii], std::stoi(tokenized_line[ii]));
  }

  // Second line.
  EXPECT_TRUE(csv_reader.ReadLine(&tokenized_line));
  EXPECT_EQ(line2.size(), tokenized_line.size());
  for (size_t ii = 0; ii < tokenized_line.size(); ++ii) {
    EXPECT_EQ(line2[ii], std::stod(tokenized_line[ii]));
  }

  // Third line.
  EXPECT_TRUE(csv_reader.ReadLine(&tokenized_line));
  EXPECT_EQ(line3.size(), tokenized_line.size());
  for (size_t ii = 0; ii < tokenized_line.size(); ++ii) {
    EXPECT_EQ(line3[ii], tokenized_line[ii].c_str());
  }

  // Fourth line.
  EXPECT_TRUE(csv_reader.ReadLine(&tokenized_line));
  EXPECT_EQ(line4.size(), tokenized_line.size());
  for (size_t ii = 0; ii < tokenized_line.size(); ++ii) {
    EXPECT_EQ(line4(ii), std::stod(tokenized_line[ii]));
  }

  // Delete the file.
  std::remove(csv_write_file.c_str());
}
Status KeyframeVisualOdometry::WriteMapToFile(
    const std::string& filename) const {
  if (tracks_.empty() && frozen_landmarks_.empty())
    return Status::Cancelled("No tracks or landmarks to write.");

  file::CsvWriter csv_writer(filename);
  if (!csv_writer.IsOpen())
    return Status::FailedPrecondition("Invalid filename.");

  // Iterate over all current tracks and frozen landmarks, storing:
  // p.x, p.y, p.z
  // where p is the 3D point.

  // First get all triangulated features that are currently being tracked.
  util::ProgressBar progress("Writing map",
                             tracks_.size() + frozen_landmarks_.size());
  for (size_t ii = 0; ii < tracks_.size(); ++ii) {
    progress.Update(ii);
    Landmark::Ptr track = Landmark::GetLandmark(tracks_[ii]);
    CHECK_NOTNULL(track.get());

    if (!track->IsEstimated())
      continue;

    std::vector<double> point_info = {track->Position().X(),
                                      track->Position().Y(),
                                      track->Position().Z()};
    csv_writer.WriteLine(point_info);
  }
  progress.Update(tracks_.size());

  // Now repeat for all frozen landmarks.
  for (size_t ii = 0; ii < frozen_landmarks_.size(); ++ii) {
    progress.Update(tracks_.size() + ii);
    Landmark::Ptr landmark = Landmark::GetLandmark(frozen_landmarks_[ii]);
    CHECK_NOTNULL(landmark.get());

    if (!landmark->IsEstimated())
      continue;

    std::vector<double> point_info = {landmark->Position().X(),
                                      landmark->Position().Y(),
                                      landmark->Position().Z()};
    csv_writer.WriteLine(point_info);
  }
  progress.Update(tracks_.size() + frozen_landmarks_.size());

  if (!csv_writer.Close()) {
    return Status::Unknown("Failed to close csv file.");
  }

  return Status::Ok();
}
TEST(CsvWriter, TestWriteLines) {

  // Write a bunch of Eigen vectors as lines to a csv file.
  CsvWriter csv_writer(csv_write_file);
  EXPECT_TRUE(csv_writer.IsOpen());

  // Make 1000 random 100-dimensional vectors.
  std::vector<Eigen::VectorXd> lines;
  for (int ii = 0; ii < 1000; ++ii) {
    lines.push_back(Eigen::Matrix<double, 100, 1>::Random());
  }

  // Store the vectors in the csv file.
  EXPECT_TRUE(csv_writer.WriteLines(lines));
  EXPECT_TRUE(csv_writer.Close());

  // Read back the lines from the csv file.
  CsvReader csv_reader(csv_write_file);
  EXPECT_TRUE(csv_reader.IsOpen());
  EXPECT_TRUE(csv_reader.HasMoreLines());

  // Make sure all lines match the original vector.
  int line_number = 0;
  std::vector<std::string> tokenized_line;
  while (csv_reader.HasMoreLines()) {
    EXPECT_TRUE(csv_reader.ReadLine(&tokenized_line));
    EXPECT_EQ(100, tokenized_line.size());
    for (size_t ii = 0; ii < tokenized_line.size(); ++ii) {
      EXPECT_NEAR(lines[line_number](ii),
                  std::stod(tokenized_line[ii]),
                  1e-4);
    }
    line_number++;
  }

  // Delete the file.
  std::remove(csv_write_file.c_str());
}
Status KeyframeVisualOdometry::WriteTrajectoryToFile(
    const std::string& filename) const {
  file::CsvWriter csv_writer(filename);
  if (!csv_writer.IsOpen())
    return Status::FailedPrecondition("Invalid filename.");

  // Iterate over all views, storing camera poses to the file. Output format
  // on each line will be:
  // view index, t.x, t.y, t.z, r.x, r.y, r.z
  // where rotations are expressed in axis-angle format.
  util::ProgressBar progress("Writing trajectory", view_indices_.size());
  for (size_t ii = 0; ii < view_indices_.size(); ++ii) {
    progress.Update(ii);

    const View::Ptr view = View::GetView(view_indices_[ii]);
    CHECK_NOTNULL(view.get());
    const Vector3d t = view->Camera().Translation();
    const Vector3d r = view->Camera().AxisAngleRotation();

    std::vector<double> camera_info = {static_cast<double>(view_indices_[ii])};
    camera_info.push_back(t(0));
    camera_info.push_back(t(1));
    camera_info.push_back(t(2));
    camera_info.push_back(r(0));
    camera_info.push_back(r(1));
    camera_info.push_back(r(2));
    csv_writer.WriteLine(camera_info);
  }
  progress.Update(view_indices_.size());

  if (!csv_writer.Close()) {
    return Status::Unknown("Failed to close csv file.");
  }

  return Status::Ok();
}