VisionaryData.cpp
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
20 // -- END LICENSE BLOCK ------------------------------------------------
21 
23 
24 #include <algorithm>
25 #include <cassert>
26 #include <chrono>
27 #include <cmath>
28 #include <ctime>
29 #include <limits>
30 #include <sstream>
31 
32 namespace visionary {
33 
34 const float bad_point = std::numeric_limits<float>::quiet_NaN();
35 
37 {
38  m_frameNum = 0;
42 }
43 
45 
46 int VisionaryData::getItemLength(std::string dataType)
47 {
48  // Transform String to lower case String
49  std::transform(dataType.begin(), dataType.end(), dataType.begin(), ::tolower);
50 
51  if (dataType == "uint8")
52  {
53  return 1;
54  }
55  else if (dataType == "uint16")
56  {
57  return 2;
58  }
59  else if (dataType == "uint32")
60  {
61  return 4;
62  }
63  else if (dataType == "uint64")
64  {
65  return 8;
66  }
67  return 0;
68 }
69 
71 {
72  assert(imgType != UNKNOWN); // Unknown image type for the point cloud transformation
73 
75 
76  //-----------------------------------------------
77  // transform each pixel into Cartesian coordinates
78  for (int row = 0; row < m_cameraParams.height; row++)
79  {
80  double yp = (m_cameraParams.cy - row) / m_cameraParams.fy;
81  double yp2 = yp * yp;
82 
83  for (int col = 0; col < m_cameraParams.width; col++)
84  {
85  // we map from image coordinates with origin top left and x
86  // horizontal (right) and y vertical
87  // (downwards) to camera coordinates with origin in center and x
88  // to the left and y upwards (seen
89  // from the sensor position)
90  const double xp = (m_cameraParams.cx - col) / m_cameraParams.fx;
91 
92  // correct the camera distortion
93  const double r2 = xp * xp + yp2;
94  const double r4 = r2 * r2;
95  const double k = 1 + m_cameraParams.k1 * r2 + m_cameraParams.k2 * r4;
96 
97  // Undistorted direction vector of the point
98  const float x = static_cast<float>(xp * k);
99  const float y = static_cast<float>(yp * k);
100  const float z = 1.0f;
101  double s0 = 0;
102  if (RADIAL == imgType)
103  {
104  s0 = std::sqrt(x * x + y * y + z * z) * 1000;
105  }
106  else if (PLANAR == imgType)
107  {
108  s0 = 1000;
109  }
110  else
111  {
112  assert(!"Unknown image type for the point cloud transformation");
113  }
114  PointXYZ point;
115  point.x = static_cast<float>(x / s0);
116  point.y = static_cast<float>(y / s0);
117  point.z = static_cast<float>(z / s0);
118 
119  m_preCalcCamInfo.push_back(point);
120  }
121  }
122  m_preCalcCamInfoType = imgType;
123 }
124 
125 void VisionaryData::generatePointCloud(const std::vector<uint16_t>& map,
126  const ImageType& imgType,
127  std::vector<PointXYZ>& pointCloud)
128 {
129  // Calculate disortion data from XML metadata once.
130  if (m_preCalcCamInfoType != imgType)
131  {
132  preCalcCamInfo(imgType);
133  }
134  size_t cloudSize = map.size();
135  pointCloud.resize(cloudSize);
136 
137  const float f2rc =
138  static_cast<float>(m_cameraParams.f2rc / 1000.f); // PointCloud should be in [m] and not in [mm]
139 
140  const float pixelSizeZ = m_scaleZ;
141 
142  //-----------------------------------------------
143  // transform each pixel into Cartesian coordinates
144  std::vector<uint16_t>::const_iterator itMap = map.begin();
145  std::vector<PointXYZ>::iterator itUndistorted = m_preCalcCamInfo.begin();
146  std::vector<PointXYZ>::iterator itPC = pointCloud.begin();
147  for (uint32_t i = 0; i < cloudSize; ++i, ++itPC, ++itMap, ++itUndistorted)
148  // for (std::vector<PointXYZ>::iterator itPC = pointCloud.begin(), itEnd = pointCloud.end(); itPC
149  // != itEnd; ++itPC, ++itMap, ++itUndistorted)
150  {
151  PointXYZ point;
152  // If point is valid put it to point cloud
153  if (*itMap == 0 || *itMap == uint16_t(0xFFFF))
154  {
155  point.x = bad_point;
156  point.y = bad_point;
157  point.z = bad_point;
158  }
159  else
160  {
161  // calculate coordinates & store in point cloud vector
162  float distance = static_cast<float>((*itMap)) * pixelSizeZ;
163  point.x = itUndistorted->x * distance;
164  point.y = itUndistorted->y * distance;
165  point.z = itUndistorted->z * distance - f2rc;
166  }
167  *itPC = point;
168  }
169  return;
170 }
171 
172 void VisionaryData::transformPointCloud(std::vector<PointXYZ>& pointCloud) const
173 {
174  // turn cam 2 world translations from [m] to [mm]
175  const double tx = m_cameraParams.cam2worldMatrix[3] / 1000.;
176  const double ty = m_cameraParams.cam2worldMatrix[7] / 1000.;
177  const double tz = m_cameraParams.cam2worldMatrix[11] / 1000.;
178 
179  for (std::vector<PointXYZ>::iterator it = pointCloud.begin(), itEnd = pointCloud.end();
180  it != itEnd;
181  ++it)
182  {
183  const double x = it->x;
184  const double y = it->y;
185  const double z = it->z;
186 
187  it->x = static_cast<float>(x * m_cameraParams.cam2worldMatrix[0] +
189  z * m_cameraParams.cam2worldMatrix[2] + tx);
190  it->y = static_cast<float>(x * m_cameraParams.cam2worldMatrix[4] +
192  z * m_cameraParams.cam2worldMatrix[6] + ty);
193  it->z = static_cast<float>(x * m_cameraParams.cam2worldMatrix[8] +
195  z * m_cameraParams.cam2worldMatrix[10] + tz);
196  }
197 }
198 
200 {
201  return m_cameraParams.height;
202 }
203 
205 {
206  return m_cameraParams.width;
207 }
208 
210 {
211  return m_frameNum;
212 }
213 
215 {
216  return m_blobTimestamp;
217 }
218 
220 {
221  std::tm tm = {static_cast<int>((m_blobTimestamp & BITMASK_SECOND) >> 10),
222  static_cast<int>((m_blobTimestamp & BITMASK_MINUTE) >> 16),
223  static_cast<int>((m_blobTimestamp & BITMASK_HOUR) >> 22),
224  static_cast<int>((m_blobTimestamp & BITMASK_DAY) >> 38),
225  static_cast<int>(((m_blobTimestamp & BITMASK_MONTH) >> 43) - 1u),
226  static_cast<int>(((m_blobTimestamp & BITMASK_YEAR) >> 47u) - 1900)};
227  tm.tm_isdst = -1; // Use DST value from local time zone
228  auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
229  uint64_t timestamp =
230  std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count() +
232 
233  return timestamp;
234 }
235 
236 uint64_t VisionaryData::getSegmentTimestampMS(uint8_t segNum) const
237 {
238  std::tm tm = {static_cast<int>((m_segmentTimestamp[segNum] & BITMASK_SECOND) >> 10),
239  static_cast<int>((m_segmentTimestamp[segNum] & BITMASK_MINUTE) >> 16),
240  static_cast<int>((m_segmentTimestamp[segNum] & BITMASK_HOUR) >> 22),
241  static_cast<int>((m_segmentTimestamp[segNum] & BITMASK_DAY) >> 38),
242  static_cast<int>(((m_segmentTimestamp[segNum] & BITMASK_MONTH) >> 43) - 1u),
243  static_cast<int>(((m_segmentTimestamp[segNum] & BITMASK_YEAR) >> 47u) - 1900)};
244  tm.tm_isdst = -1; // Use DST value from local time zone
245  auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
246  uint64_t segTimestamp =
247  std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count() +
249 
250  return segTimestamp;
251 }
252 
254 {
255  return m_cameraParams;
256 }
257 
258 } // namespace visionary
visionary::CameraParameters::fy
double fy
Definition: VisionaryData.h:44
visionary::VisionaryData::getSegmentTimestampMS
uint64_t getSegmentTimestampMS(uint8_t segNum) const
Definition: VisionaryData.cpp:236
visionary::PointXYZ::x
float x
Definition: PointXYZ.h:28
visionary::VisionaryData::UNKNOWN
@ UNKNOWN
Definition: VisionaryData.h:200
visionary::CameraParameters::cy
double cy
Definition: VisionaryData.h:44
visionary::VisionaryData::generatePointCloud
virtual void generatePointCloud(std::vector< PointXYZ > &pointCloud)=0
visionary
Definition: AuthenticationLegacy.h:25
visionary::VisionaryData::getTimestamp
uint64_t getTimestamp() const
Definition: VisionaryData.cpp:214
visionary::VisionaryData::BITMASK_MILLISECOND
static const uint64_t BITMASK_MILLISECOND
Definition: VisionaryData.h:268
visionary::VisionaryData::getTimestampMS
uint64_t getTimestampMS() const
Definition: VisionaryData.cpp:219
visionary::CameraParameters::fx
double fx
Camera Matrix.
Definition: VisionaryData.h:44
visionary::VisionaryData::getWidth
int getWidth() const
Definition: VisionaryData.cpp:204
visionary::bad_point
const float bad_point
Definition: VisionaryData.cpp:34
visionary::VisionaryData::getFrameNum
uint32_t getFrameNum() const
Definition: VisionaryData.cpp:209
visionary::VisionaryData::BITMASK_HOUR
static const uint64_t BITMASK_HOUR
Definition: VisionaryData.h:262
visionary::VisionaryData::preCalcCamInfo
void preCalcCamInfo(const ImageType &type)
Definition: VisionaryData.cpp:70
visionary::VisionaryData::BITMASK_SECOND
static const uint64_t BITMASK_SECOND
Definition: VisionaryData.h:266
visionary::VisionaryData::m_preCalcCamInfoType
ImageType m_preCalcCamInfoType
Definition: VisionaryData.h:247
visionary::VisionaryData::BITMASK_YEAR
static const uint64_t BITMASK_YEAR
Definition: VisionaryData.h:256
visionary::PointXYZ
Definition: PointXYZ.h:26
visionary::VisionaryData::m_blobTimestamp
uint64_t m_blobTimestamp
Definition: VisionaryData.h:239
VisionaryData.h
visionary::VisionaryData::getCameraParameters
const CameraParameters & getCameraParameters() const
Definition: VisionaryData.cpp:253
visionary::VisionaryData::~VisionaryData
~VisionaryData()
Definition: VisionaryData.cpp:44
visionary::PointXYZ::z
float z
Definition: PointXYZ.h:30
visionary::VisionaryData::PLANAR
@ PLANAR
Definition: VisionaryData.h:201
visionary::VisionaryData::m_frameNum
uint_fast32_t m_frameNum
Definition: VisionaryData.h:235
visionary::VisionaryData::VisionaryData
VisionaryData()
Definition: VisionaryData.cpp:36
visionary::CameraParameters::cx
double cx
Definition: VisionaryData.h:44
visionary::CameraParameters::height
int height
The height of the frame in pixels.
Definition: VisionaryData.h:38
visionary::VisionaryData::BITMASK_MINUTE
static const uint64_t BITMASK_MINUTE
Definition: VisionaryData.h:264
visionary::VisionaryData::m_scaleZ
float m_scaleZ
Factor to convert unit of distance image to mm.
Definition: VisionaryData.h:227
visionary::CameraParameters::k2
double k2
Definition: VisionaryData.h:46
visionary::CameraParameters::width
int width
The width of the frame in pixels.
Definition: VisionaryData.h:40
visionary::VisionaryData::m_preCalcCamInfo
std::vector< PointXYZ > m_preCalcCamInfo
Definition: VisionaryData.h:249
visionary::VisionaryData::transformPointCloud
void transformPointCloud(std::vector< PointXYZ > &pointCloud) const
Definition: VisionaryData.cpp:172
visionary::CameraParameters::f2rc
double f2rc
FocalToRayCross - Correction Offset for depth info.
Definition: VisionaryData.h:48
visionary::VisionaryData::getHeight
int getHeight() const
Definition: VisionaryData.cpp:199
visionary::VisionaryData::m_cameraParams
CameraParameters m_cameraParams
Definition: VisionaryData.h:223
visionary::CameraParameters
Definition: VisionaryData.h:35
visionary::VisionaryData::BITMASK_DAY
static const uint64_t BITMASK_DAY
Definition: VisionaryData.h:260
visionary::CameraParameters::cam2worldMatrix
double cam2worldMatrix[4 *4]
Camera to world transformation matrix.
Definition: VisionaryData.h:42
visionary::VisionaryData::getItemLength
int getItemLength(std::string dataType)
Definition: VisionaryData.cpp:46
visionary::VisionaryData::RADIAL
@ RADIAL
Definition: VisionaryData.h:202
visionary::PointXYZ::y
float y
Definition: PointXYZ.h:29
visionary::CameraParameters::k1
double k1
Camera Distortion Parameters.
Definition: VisionaryData.h:46
visionary::VisionaryData::m_segmentTimestamp
uint64_t m_segmentTimestamp[TOTAL_SEGMENT_NUMBER]
Definition: VisionaryData.h:243
visionary::VisionaryData::BITMASK_MONTH
static const uint64_t BITMASK_MONTH
Definition: VisionaryData.h:258
visionary::VisionaryData::ImageType
ImageType
Definition: VisionaryData.h:198


sick_safevisionary_base
Author(s):
autogenerated on Sat Oct 21 2023 02:24:26