46#ifndef UFO_VISION_CAMERA_PERSPECTIVE_HPP
47#define UFO_VISION_CAMERA_PERSPECTIVE_HPP
50#include <ufo/execution/algorithm.hpp>
51#include <ufo/execution/execution.hpp>
52#include <ufo/geometry/ray.hpp>
53#include <ufo/numeric/mat.hpp>
54#include <ufo/numeric/transform.hpp>
55#include <ufo/numeric/vec.hpp>
56#include <ufo/vision/camera/perspective_intrinsics.hpp>
57#include <ufo/vision/image.hpp>
121 [[nodiscard]]
Mat4f projection()
const
131 [[nodiscard]] Mat4f view()
const {
return Mat4f(
pose); }
133 [[nodiscard]] Image<Ray3f> rays()
const {
return rays(ufo::execution::seq); }
135 template <
class ExecutionPolicy>
136 [[nodiscard]] Image<Ray3f> rays(ExecutionPolicy&& policy)
const
138 auto const view_inv = view();
142 std::forward<ExecutionPolicy>(policy), std::size_t{},
intrinsics.
rows,
143 [
this, &rays, &view_inv, fx = fx(), fy = fy()](std::size_t y) {
146 std::mt19937 gen_local;
149 static thread_local std::mt19937 gen_tl(std::random_device{}());
151 std::mt19937& gen = deterministic ? gen_local : gen_tl;
152 std::uniform_real_distribution<float> dist(-1.0f, 1.0f);
158 for (std::size_t x{}; rays.cols() > x; ++x) {
162 Vec3f dir_cam =
normalize(Vec3f(dx, dy, 1.0f));
165 float const theta = 2.0f * std::numbers::pi_v<float> * dist(gen);
166 Vec3f
const origin_cam(r * std::cos(theta), r * std::sin(theta), 0.0f);
169 Vec3f
const p_focus = dir_cam * ft;
170 dir_cam =
normalize(p_focus - origin_cam);
172 rays[y, x].origin = ufo::convert<Vec3f>(
173 view_inv * Vec4f(origin_cam.x(), origin_cam.y(), origin_cam.z(), 1.0f));
174 rays[y, x].direction = ufo::convert<Vec3f>(
175 view_inv * Vec4f(dir_cam.x(), dir_cam.y(), dir_cam.z(), 0.0f));
178 for (std::size_t x{}; rays.cols() > x; ++x) {
182 Vec3f
const dir_cam =
normalize(Vec3f(dx, dy, 1.0f));
185 ufo::convert<Vec3f>(view_inv * Vec4f(0.0f, 0.0f, 0.0f, 1.0f));
186 rays[y, x].direction = ufo::convert<Vec3f>(
187 view_inv * Vec4f(dir_cam.x(), dir_cam.y(), dir_cam.z(), 0.0f));
194 [[nodiscard]]
float fx() const noexcept
201 [[nodiscard]]
float fy() const noexcept
208 [[nodiscard]]
friend bool operator==(PerspectiveCamera
const&,
209 PerspectiveCamera
const&)
noexcept =
default;
217 os <<
"Pose: " << camera.
pose <<
'\n'
219 <<
", Far clip: " << camera.
far_clip <<
'\n';
229struct std::formatter<
ufo::PerspectiveCamera> {
230 constexpr auto parse(std::format_parse_context& ctx)
const {
return ctx.begin(); }
234 return std::format_to(ctx.out(),
"Pose: {}\n{}\nNear clip: {}, Far clip: {}",
All vision-related classes and functions.
constexpr UnaryFunc for_each(Index first, Index last, UnaryFunc f, Proj proj={})
Applies f to each integer index in [first, last) sequentially.
Mat< 4, 4, T > perspective(T fovy, T aspect, T near, T far)
Builds a perspective projection matrix (OpenCV convention).
constexpr Quat< T > normalize(Quat< T > const &q) noexcept
Returns a unit quaternion in the same direction as q.
constexpr M inverse(M const &m) noexcept
Computes the inverse of a square floating-point matrix.
Mat< 4, 4, T > lookAt(Vec< 3, T > const &eye, Vec< 3, T > const &target, Vec< 3, T > const &up)
Builds a view matrix (OpenCV convention).
Perspective camera model for ray-generation and projection.
void lookAt(Vec3f center, Vec3f const &target, Vec3f const &up)
Orients the camera so it looks from center toward target.
Transform3f pose
Camera-to-world pose transform.
float far_clip
Distance to the far clipping plane.
float near_clip
Distance to the near clipping plane.
PerspectiveIntrinsics intrinsics
The intrinsic parameters of the camera.
Stores the intrinsic parameters of a perspective camera.
float fy
Vertical focal length in pixels.
float focus_distance
Distance to the focal plane.
float cy
Vertical principal point in pixels.
float fx
Horizontal focal length in pixels.
float vertical_fov
Vertical field of view in radians.
bool deterministic
Whether ray generation should be deterministic.
float cx
Horizontal principal point in pixels.
std::size_t rows
Image height in pixels.
std::size_t cols
Image width in pixels.
float lens_radius
Radius of the camera lens.