39#include <visp3/core/vpColorDepthConversion.h>
43#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_17)
48#include <visp3/core/vpMath.h>
49#include <visp3/core/vpMeterPixelConversion.h>
50#include <visp3/core/vpPixelMeterConversion.h>
54#ifndef DOXYGEN_SHOULD_SKIP_THIS
68#if (VISP_CXX_STANDARD > VISP_CXX_STANDARD_98)
84#if (VISP_CXX_STANDARD > VISP_CXX_STANDARD_98)
85 from_point = { from_point, 0, 3 };
87 return { extrinsics_params * from_point, 0, 3 };
91 return vpColVector(extrinsics_params * from_point, 0, 3);
104#if (VISP_CXX_STANDARD > VISP_CXX_STANDARD_98)
124#if (VISP_CXX_STANDARD > VISP_CXX_STANDARD_98)
125 double x { 0. },
y { 0. };
129 double x = 0.,
y = 0.;
140#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_17)
141double getDepth(
const float *data,
const std::optional<double> depth_scale,
const double &offset)
144 return static_cast<double>(
data[
static_cast<int>(offset)]);
147double getDepth(
const uint16_t *data,
const std::optional<double> depth_scale,
const double &offset)
149 return *
depth_scale *
static_cast<double>(
data[
static_cast<int>(offset)]);
169template<
typename Type>
171 const Type *data, std::optional<double> depth_scale,
const double &depth_min,
const double &depth_max,
const double &depth_width,
178 const auto min_point = deproject(color_intrinsics, from_pixel, depth_min);
179 const auto min_transformed_point = transform(depth_M_color, min_point);
180 auto start_pixel = project(depth_intrinsics, min_transformed_point);
181 start_pixel = adjust2DPointToBoundary(start_pixel, depth_width, depth_height);
184 const auto max_point = deproject(color_intrinsics, from_pixel, depth_max);
185 const auto max_transformed_point = transform(depth_M_color, max_point);
186 auto end_pixel = project(depth_intrinsics, max_transformed_point);
187 end_pixel = adjust2DPointToBoundary(end_pixel, depth_width, depth_height);
191 for (
auto curr_pixel = start_pixel; curr_pixel.inSegment(start_pixel, end_pixel) && (curr_pixel != end_pixel);
192 curr_pixel = curr_pixel.nextInSegment(start_pixel, end_pixel)) {
193 const auto depth = getDepth(data, depth_scale, (curr_pixel.get_v() * depth_width) + curr_pixel.get_u());
194 bool stop_for_loop =
false;
195 if (std::fabs(depth) <= std::numeric_limits<double>::epsilon()) {
196 stop_for_loop =
true;
198 if (!stop_for_loop) {
199 const auto point = deproject(depth_intrinsics, curr_pixel, depth);
200 const auto transformed_point = transform(color_M_depth, point);
201 const auto projected_pixel = project(color_intrinsics, transformed_point);
203 const auto new_dist =
vpMath::sqr(projected_pixel.get_v() - from_pixel.
get_v()) +
205 if ((new_dist < min_dist) || (min_dist < 0)) {
207 depth_pixel = curr_pixel;
214double getDepth(
const float *data,
const double *depth_scale,
const double &offset)
217 return static_cast<double>(
data[
static_cast<int>(offset)]);
220double getDepth(
const uint16_t *data,
const double *depth_scale,
const double &offset)
222 return *
depth_scale *
static_cast<double>(
data[
static_cast<int>(offset)]);
225template<
typename Type>
227 const Type *data,
const double *depth_scale,
const double &depth_min,
const double &depth_max,
const double &depth_width,
234 const vpColVector min_point = deproject(color_intrinsics, from_pixel, depth_min);
235 const vpColVector min_transformed_point = transform(depth_M_color, min_point);
236 vpImagePoint start_pixel = project(depth_intrinsics, min_transformed_point);
237 start_pixel = adjust2DPointToBoundary(start_pixel, depth_width, depth_height);
240 const vpColVector max_point = deproject(color_intrinsics, from_pixel, depth_max);
241 const vpColVector max_transformed_point = transform(depth_M_color, max_point);
242 vpImagePoint end_pixel = project(depth_intrinsics, max_transformed_point);
243 end_pixel = adjust2DPointToBoundary(end_pixel, depth_width, depth_height);
246 double min_dist = -1.;
247 for (
vpImagePoint curr_pixel = start_pixel; curr_pixel.
inSegment(start_pixel, end_pixel) && curr_pixel != end_pixel;
248 curr_pixel = curr_pixel.nextInSegment(start_pixel, end_pixel)) {
249 const double depth = getDepth(data, depth_scale, (curr_pixel.get_v() * depth_width) + curr_pixel.get_u());
251 bool stop_for_loop =
false;
252 if (std::fabs(depth) <= std::numeric_limits<double>::epsilon()) {
253 stop_for_loop =
true;
255 if (!stop_for_loop) {
256 const vpColVector point = deproject(depth_intrinsics, curr_pixel, depth);
257 const vpColVector transformed_point = transform(color_M_depth, point);
258 const vpImagePoint projected_pixel = project(color_intrinsics, transformed_point);
262 if (new_dist < min_dist || min_dist < 0) {
264 depth_pixel = curr_pixel;
291 const vpImage<uint16_t> &I_depth,
const double &depth_scale,
const double &depth_min,
const double &depth_max,
295 return projectColorToDepth(I_depth.bitmap, depth_scale, depth_min, depth_max, I_depth.getWidth(), I_depth.getHeight(),
296 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
317 const uint16_t *data,
const double &depth_scale,
const double &depth_min,
const double &depth_max,
const double &depth_width,
321#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_17)
322 return project_color_to_depth(data, std::optional<double>(depth_scale), depth_min, depth_max, depth_width, depth_height,
323 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
326 return project_color_to_depth(data, &depth_scale, depth_min, depth_max, depth_width, depth_height,
327 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
345 const vpImage<float> &I_depth,
const double &depth_min,
const double &depth_max,
349 return projectColorToDepth(I_depth.bitmap, depth_min, depth_max, I_depth.getWidth(), I_depth.getHeight(),
350 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
369 const float *data,
const double &depth_min,
const double &depth_max,
const double &depth_width,
373#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_17)
374 return project_color_to_depth(data, std::nullopt, depth_min, depth_max, depth_width, depth_height,
375 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
378 return project_color_to_depth(data,
nullptr, depth_min, depth_max, depth_width, depth_height,
379 depth_intrinsics, color_intrinsics, color_M_depth, depth_M_color, from_pixel);
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
static vpImagePoint projectColorToDepth(const vpImage< uint16_t > &I_depth, const double &depth_scale, const double &depth_min, const double &depth_max, const vpCameraParameters &depth_intrinsics, const vpCameraParameters &color_intrinsics, const vpHomogeneousMatrix &color_M_depth, const vpHomogeneousMatrix &depth_M_color, const vpImagePoint &from_pixel)
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
bool inSegment(const vpImagePoint &start, const vpImagePoint &end) const
Definition of the vpImage class member functions.
static double sqr(double x)
static T clamp(const T &v, const T &lower, const T &upper)
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)