image_proc_utils.h
Go to the documentation of this file.
1 /******************************************************************************
2 Copyright (c), 2023 - Analog Devices Inc. All Rights Reserved.
3 This software is PROPRIETARY & CONFIDENTIAL to Analog Devices, Inc.
4 and its licensors.
5 ******************************************************************************/
6 
7 #ifndef IMAGE_PROC_UTILS_H
8 #define IMAGE_PROC_UTILS_H
9 
10 #include "adi_camera.h"
11 #include <cv_bridge/cv_bridge.h>
12 #include <opencv2/calib3d.hpp>
13 #include <cmath>
14 
20 {
21 public:
22  // default constructor with no argument
23  ImageProcUtils() = default;
24 
25  ImageProcUtils(CameraIntrinsics* camera_intrinsics, int image_width, int image_height)
26  {
27  image_width_ = image_width;
28  image_height_ = image_height;
29 
30  // Generate LUT for range to depth correction
31  range_to_3d_lut_ = new float[image_width_ * image_height_ * 3];
32  memset(range_to_3d_lut_, 0, sizeof(float) * image_width_ * image_height_ * 3);
33 
34  generateRangeTo3DLUT(camera_intrinsics);
35  }
36 
38  {
39  // Generate LUT for range to depth correction
40  delete[] range_to_3d_lut_;
41  }
42 
49  void generateRangeTo3DLUT(CameraIntrinsics* camera_intrinsics)
50  {
51  /* Generate Camera Intrinsics calibration arrays. */
52  double k_raw_array[9] = { camera_intrinsics->camera_matrix[0], camera_intrinsics->camera_matrix[1],
53  camera_intrinsics->camera_matrix[2], camera_intrinsics->camera_matrix[3],
54  camera_intrinsics->camera_matrix[4], camera_intrinsics->camera_matrix[5],
55  camera_intrinsics->camera_matrix[6], camera_intrinsics->camera_matrix[7],
56  camera_intrinsics->camera_matrix[8] };
57  double d_raw_array[8] = { camera_intrinsics->distortion_coeffs[0], camera_intrinsics->distortion_coeffs[1],
58  camera_intrinsics->distortion_coeffs[2], camera_intrinsics->distortion_coeffs[3],
59  camera_intrinsics->distortion_coeffs[4], camera_intrinsics->distortion_coeffs[5],
60  camera_intrinsics->distortion_coeffs[6], camera_intrinsics->distortion_coeffs[7] };
61 
62  cv::Mat K_raw = cv::Mat(3, 3, CV_64F, k_raw_array);
63  cv::Mat D_raw = cv::Mat(1, 8, CV_64F, d_raw_array);
64  cv::Size img_size(image_width_, image_height_);
65  cv::Mat K_rect = cv::getOptimalNewCameraMatrix(K_raw, D_raw, img_size, 0, img_size, nullptr);
66 
67  // Prepare the rectification maps
68  cv::Mat r = cv::Mat::eye(3, 3, CV_32F);
69 
70  float* range_to_3d_lut = range_to_3d_lut_;
71 
72  for (int y = 0; y < image_height_; y++)
73  {
74  for (int x = 0; x < image_width_; x++)
75  {
76  cv::Mat distorted_pt(1, 1, CV_32FC2, cv::Scalar(x, y));
77  cv::Mat undistorted_pt(1, 1, CV_32FC2);
78 
79  cv::undistortPoints(distorted_pt, undistorted_pt, K_raw, D_raw);
80 
81  float ux = undistorted_pt.at<float>(0);
82  float uy = undistorted_pt.at<float>(1);
83 
84  float scale_factor = 1.0f / sqrtf(1.0f + ux * ux + uy * uy);
85 
86  *range_to_3d_lut++ = (ux * scale_factor);
87  *range_to_3d_lut++ = (uy * scale_factor);
88  *range_to_3d_lut++ = (scale_factor);
89  }
90  }
91  }
92 
100  void computePointCloud(unsigned short* range_image, short* xyz_frame)
101  {
102  float* range_to_3d_lut = range_to_3d_lut_;
103 
104  for (int i = 0; i < image_height_; i++)
105  {
106  for (int j = 0; j < image_width_; j++)
107  {
108  *xyz_frame++ = (*range_to_3d_lut++) * (*range_image);
109  *xyz_frame++ = (*range_to_3d_lut++) * (*range_image);
110  *xyz_frame++ = (*range_to_3d_lut++) * (*range_image);
111  range_image++;
112  }
113  }
114  }
115 
116 private:
117  int image_width_;
118  int image_height_;
119  float* range_to_3d_lut_;
120 };
121 
122 #endif
ImageProcUtils::image_width_
int image_width_
Definition: image_proc_utils.h:121
CameraIntrinsics::camera_matrix
float camera_matrix[9]
Camera matrix = [fx, 0, cx, 0, fy, cy, 0, 0, 1] fx, fy : Camera focal lengths (pixels) cx,...
Definition: adi_camera.h:27
ImageProcUtils
This class has image processing utilities.
Definition: image_proc_utils.h:19
ImageProcUtils::image_height_
int image_height_
Definition: image_proc_utils.h:122
ImageProcUtils::range_to_3d_lut_
float * range_to_3d_lut_
Definition: image_proc_utils.h:123
ImageProcUtils::computePointCloud
void computePointCloud(unsigned short *range_image, short *xyz_frame)
Computes point cloud using range_to_3d_lut look up table and range image.
Definition: image_proc_utils.h:104
adi_camera.h
ImageProcUtils::ImageProcUtils
ImageProcUtils()=default
cv_bridge.h
CameraIntrinsics
Intrinsic parameters of the camera.
Definition: adi_camera.h:15
CameraIntrinsics::distortion_coeffs
float distortion_coeffs[8]
Distortion vector = [k1, k2, p1, p2, k3, k4, k5, k6] k1, k2, k3, k4, k5, k6 : Camera radial distortio...
Definition: adi_camera.h:35
ImageProcUtils::~ImageProcUtils
~ImageProcUtils()
Definition: image_proc_utils.h:41
ImageProcUtils::generateRangeTo3DLUT
void generateRangeTo3DLUT(CameraIntrinsics *camera_intrinsics)
Generates a Range to 3D projection Look up table, which can be used to compute point-cloud from the d...
Definition: image_proc_utils.h:53


adi_3dtof_adtf31xx
Author(s):
autogenerated on Sat May 17 2025 02:12:30