47 if (values->empty()) {
52 std::sort(values->begin(), values->end());
53 min = (*values)[
static_cast<size_t>(
min_q * (values->size() - 1))];
54 max = (*values)[
static_cast<size_t>(
max_q * (values->size() - 1))];
63 const float gray_clipped = std::min(std::max(gray,
min),
max);
64 const float gray_scaled = (gray_clipped -
min) /
range;
65 return std::pow(gray_scaled,
scale);
71 std::unordered_map<image_t, Image> & images,
72 std::unordered_map<point3D_t, Point3D> &
74 std::vector<image_t>& reg_image_ids) {}
78 return Eigen::Vector4f(point3D.
Color(0) / 255.0f, point3D.
Color(1) / 255.0f,
79 point3D.
Color(2) / 255.0f, 1.0f);
83 std::unordered_map<image_t, Image> & images,
84 std::unordered_map<point3D_t, Point3D> & points3D,
85 std::vector<image_t>& reg_image_ids) {
86 std::vector<float> errors;
87 errors.reserve(points3D.size());
89 for (
const auto& point3D : points3D) {
90 errors.push_back(
static_cast<float>(point3D.second.Error()));
104 std::unordered_map<image_t, Image> & images,
105 std::unordered_map<point3D_t, Point3D> &
107 std::vector<image_t>& reg_image_ids) {
108 std::vector<float> track_lengths;
109 track_lengths.reserve(points3D.size());
111 for (
const auto& point3D : points3D) {
112 track_lengths.push_back(point3D.second.Track().Length());
126 std::unordered_map<camera_t, Camera> & cameras,
127 std::unordered_map<image_t, Image> & images,
128 std::unordered_map<point3D_t, Point3D> & points3D,
129 std::vector<image_t>& reg_image_ids) {
130 std::vector<float> resolutions;
131 resolutions.reserve(points3D.size());
133 std::unordered_map<camera_t, float> focal_lengths;
134 std::unordered_map<camera_t, Eigen::Vector2f> principal_points;
135 for (
const auto& camera : cameras) {
136 focal_lengths[camera.first] =
137 static_cast<float>(camera.second.MeanFocalLength());
138 principal_points[camera.first] =
139 Eigen::Vector2f(
static_cast<float>(camera.second.PrincipalPointX()),
140 static_cast<float>(camera.second.PrincipalPointY()));
143 std::unordered_map<image_t, Eigen::Vector3f> proj_centers;
144 for (
const auto&
image : images) {
145 proj_centers[
image.first] =
image.second.ProjectionCenter().cast<
float>();
148 for (
const auto& point3D : points3D) {
149 float min_resolution = std::numeric_limits<float>::max();
151 const Eigen::Vector3f xyz = point3D.second.XYZ().cast<
float>();
153 for (
const auto track_el : point3D.second.Track().Elements()) {
154 const auto&
image = images[track_el.image_id];
155 const float focal_length = focal_lengths[
image.CameraId()];
156 const float focal_length2 = focal_length * focal_length;
157 const Eigen::Vector2f& pp = principal_points[
image.CameraId()];
159 const Eigen::Vector2f xy =
160 image.Point2D(track_el.point2D_idx).XY().cast<
float>() - pp;
163 const float pixel_radius1 = xy.norm();
165 const float x1 = xy(0) + (xy(0) < 0 ? -1.0f : 1.0f);
166 const float y1 = xy(1) + (xy(1) < 0 ? -1.0f : 1.0f);
167 const float pixel_radius2 = std::sqrt(x1 * x1 + y1 * y1);
170 const float pixel_dist1 =
171 std::sqrt(pixel_radius1 * pixel_radius1 + focal_length2);
172 const float pixel_dist2 =
173 std::sqrt(pixel_radius2 * pixel_radius2 + focal_length2);
176 const float dist = (xyz - proj_centers[track_el.image_id]).norm();
179 const float r1 = pixel_radius1 * dist / pixel_dist1;
180 const float r2 = pixel_radius2 * dist / pixel_dist2;
181 const float dr = r2 - r1;
185 const float resolution = -dr * dr;
187 if (std::isfinite(resolution)) {
188 min_resolution = std::min(resolution, min_resolution);
192 resolutions.push_back(min_resolution);
193 resolutions_[point3D.first] = min_resolution;
201 const float gray =
AdjustScale(resolutions_[point3D_id]);
214 std::unordered_map<image_t, Image> & images,
215 std::unordered_map<point3D_t, Point3D> &
217 std::vector<image_t>& reg_image_ids) {}
220 Eigen::Vector4f* plane_color,
221 Eigen::Vector4f* frame_color) {
228 std::unordered_map<image_t, Image> & images,
229 std::unordered_map<point3D_t, Point3D> &
231 std::vector<image_t>& reg_image_ids) {}
234 const std::string& word,
const Eigen::Vector4f& plane_color,
235 const Eigen::Vector4f& frame_color) {
236 image_name_colors_.emplace_back(word,
241 Eigen::Vector4f* plane_color,
242 Eigen::Vector4f* frame_color) {
243 for (
const auto& image_name_color : image_name_colors_) {
245 *plane_color = image_name_color.second.first;
246 *frame_color = image_name_color.second.second;
std::shared_ptr< core::Tensor > image
static const Eigen::Vector4f kDefaultPlaneColor
static const Eigen::Vector4f kDefaultFrameColor
void AddColorForWord(const std::string &word, const Eigen::Vector4f &plane_color, const Eigen::Vector4f &frame_color)
void ComputeColor(const Image &image, Eigen::Vector4f *plane_color, Eigen::Vector4f *frame_color) override
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > ®_image_ids) override
static float Red(const float gray)
static float Blue(const float gray)
static float Green(const float gray)
const class Track & Track() const
const Eigen::Vector3ub & Color() const
float AdjustScale(const float gray)
void UpdateScale(std::vector< float > *values)
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > ®_image_ids) override
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > ®_image_ids) override
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > ®_image_ids) override
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > ®_image_ids) override
CLOUDVIEWER_HOST_DEVICE Pair< First, Second > make_pair(const First &_first, const Second &_second)
bool StringContains(const std::string &str, const std::string &sub_str)