mirror of
https://github.com/karma-riuk/hdr_esim.git
synced 2024-11-23 14:47:50 +01:00
Added the logging of the frames and the exposure times to the camera simulator
(couldn't do it with the publisher because the info wasn't available in the sim_data)
This commit is contained in:
parent
d17d5e0a1a
commit
8280d179cd
@ -1,62 +1,99 @@
|
|||||||
|
#include "esim/common/string_format.hpp"
|
||||||
|
#include "opencv2/imgcodecs.hpp"
|
||||||
|
|
||||||
#include <esim/esim/camera_simulator.hpp>
|
#include <esim/esim/camera_simulator.hpp>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <ostream>
|
||||||
|
#include <ze/common/file_utils.hpp>
|
||||||
|
|
||||||
|
#define FRAME_DIR_PATH "/home/arno/sim_ws/out/frames"
|
||||||
|
|
||||||
|
static uint frame_number = 0;
|
||||||
|
static std::ofstream exposures_file_;
|
||||||
|
static std::string output_folder = "/home/arno/sim_ws/out";
|
||||||
|
|
||||||
namespace event_camera_simulator {
|
namespace event_camera_simulator {
|
||||||
|
|
||||||
void ImageBuffer::addImage(Time t, const Image& img)
|
void ImageBuffer::addImage(Time t, const Image& img) {
|
||||||
{
|
if (!data_.empty()) {
|
||||||
if(!data_.empty())
|
// Check that the image timestamps are monotonically increasing
|
||||||
{
|
CHECK_GT(t, data_.back().stamp);
|
||||||
// Check that the image timestamps are monotonically increasing
|
}
|
||||||
CHECK_GT(t, data_.back().stamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
Duration exposure_time = data_.empty() ? 0 : t - data_.back().stamp;
|
Duration exposure_time = data_.empty() ? 0 : t - data_.back().stamp;
|
||||||
VLOG(2) << "Adding image to buffer with stamp: " << t
|
VLOG(2) << "Adding image to buffer with stamp: " << t
|
||||||
<< " and exposure time " << exposure_time;
|
<< " and exposure time " << exposure_time;
|
||||||
data_.push_back(ImageData(img.clone(), t, exposure_time));
|
data_.push_back(ImageData(img.clone(), t, exposure_time));
|
||||||
|
|
||||||
// Remove all the images with timestamp older than t - buffer_size_ns_
|
// Remove all the images with timestamp older than t - buffer_size_ns_
|
||||||
auto first_valid_element = std::lower_bound(data_.begin(), data_.end(), t - buffer_size_ns_,
|
auto first_valid_element = std::lower_bound(
|
||||||
[](ImageData lhs, Time rhs) -> bool { return lhs.stamp < rhs; });
|
data_.begin(),
|
||||||
|
data_.end(),
|
||||||
|
t - buffer_size_ns_,
|
||||||
|
[](ImageData lhs, Time rhs) -> bool { return lhs.stamp < rhs; }
|
||||||
|
);
|
||||||
|
|
||||||
data_.erase(data_.begin(), first_valid_element);
|
data_.erase(data_.begin(), first_valid_element);
|
||||||
VLOG(3) << "first/last element in buffer: "
|
VLOG(3) << "first/last element in buffer: " << data_.front().stamp
|
||||||
<< data_.front().stamp
|
<< " " << data_.back().stamp;
|
||||||
<< " " << data_.back().stamp;
|
VLOG(3) << "number of images in the buffer: " << data_.size();
|
||||||
VLOG(3) << "number of images in the buffer: " << data_.size();
|
|
||||||
|
|
||||||
CHECK_LE(data_.back().stamp - data_.front().stamp, buffer_size_ns_);
|
CHECK_LE(data_.back().stamp - data_.front().stamp, buffer_size_ns_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CameraSimulator::imageCallback(
|
||||||
|
const Image& img, Time time, const ImagePtr& camera_image
|
||||||
|
) {
|
||||||
|
CHECK(camera_image);
|
||||||
|
CHECK_EQ(camera_image->size(), img.size());
|
||||||
|
|
||||||
|
buffer_->addImage(time, img);
|
||||||
|
|
||||||
|
static const Time initial_time = time;
|
||||||
|
if (time - initial_time < exposure_time_) {
|
||||||
|
LOG_FIRST_N(WARNING, 1) << "The images do not cover a time span "
|
||||||
|
"long enough to simulate the "
|
||||||
|
"exposure time accurately.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// average all the images in the buffer to simulate motion blur
|
||||||
|
camera_image->setTo(0);
|
||||||
|
ze::real_t denom = 0.;
|
||||||
|
for (const ImageBuffer::ImageData& img : buffer_->getRawBuffer()) {
|
||||||
|
*camera_image +=
|
||||||
|
ze::nanosecToMillisecTrunc(img.exposure_time) * img.image;
|
||||||
|
denom += ze::nanosecToMillisecTrunc(img.exposure_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint frame_number = 0;
|
||||||
|
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << output_folder << "/frames/frame_" << std::setfill('0')
|
||||||
|
<< std::setw(5) << frame_number++ << ".exr";
|
||||||
|
std::string frame_path = ss.str();
|
||||||
|
cv::imwrite(frame_path, *camera_image);
|
||||||
|
|
||||||
|
// ze::openOutputFileStream(
|
||||||
|
// ze::joinPath(output_folder, "exposures.csv"),
|
||||||
|
// &exposures_file_
|
||||||
|
// );
|
||||||
|
|
||||||
|
exposures_file_.open(
|
||||||
|
ze::joinPath(output_folder, "exposures.csv"),
|
||||||
|
std::ios::app
|
||||||
|
);
|
||||||
|
exposures_file_ << time << "," << frame_number << ","
|
||||||
|
<< buffer_->getExposureTime() << std::endl;
|
||||||
|
exposures_file_.close();
|
||||||
|
|
||||||
|
|
||||||
bool CameraSimulator::imageCallback(const Image &img, Time time,
|
*camera_image /= denom;
|
||||||
const ImagePtr& camera_image)
|
cv::Mat disp;
|
||||||
{
|
camera_image->convertTo(disp, CV_8U, 255);
|
||||||
CHECK(camera_image);
|
|
||||||
CHECK_EQ(camera_image->size(), img.size());
|
|
||||||
|
|
||||||
buffer_->addImage(time, img);
|
return true;
|
||||||
|
}
|
||||||
static const Time initial_time = time;
|
|
||||||
if(time - initial_time < exposure_time_)
|
|
||||||
{
|
|
||||||
LOG_FIRST_N(WARNING, 1) << "The images do not cover a time span long enough to simulate the exposure time accurately.";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// average all the images in the buffer to simulate motion blur
|
|
||||||
camera_image->setTo(0);
|
|
||||||
ze::real_t denom = 0.;
|
|
||||||
for(const ImageBuffer::ImageData& img : buffer_->getRawBuffer())
|
|
||||||
{
|
|
||||||
*camera_image += ze::nanosecToMillisecTrunc(img.exposure_time) * img.image;
|
|
||||||
denom += ze::nanosecToMillisecTrunc(img.exposure_time);
|
|
||||||
}
|
|
||||||
*camera_image /= denom;
|
|
||||||
cv::Mat disp;
|
|
||||||
camera_image->convertTo(disp, CV_8U, 255);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace event_camera_simulator
|
} // namespace event_camera_simulator
|
||||||
|
Loading…
Reference in New Issue
Block a user