34 #include <Calibration/Calibration.h>
35 #include <Calibration/StereoCalibration.h>
36 #include <Image/ImageProcessor.h>
37 #include <rc_genicam_api/buffer.h>
38 #include <rc_genicam_api/config.h>
39 #include <rc_genicam_api/image.h>
40 #include <rc_genicam_api/interface.h>
41 #include <rc_genicam_api/pixel_formats.h>
42 #include <rc_genicam_api/system.h>
58 if (!getenv(
"GENICAM_GENTL64_PATH"))
60 setenv(
"GENICAM_GENTL64_PATH",
"/usr/lib/rc_genicam_api/", 0);
62 dev = rcg::getDevice(dname.c_str());
66 const auto dname2 =
"devicemodul" + dname;
67 dev = rcg::getDevice(dname2.c_str());
73 dev->open(rcg::Device::EXCLUSIVE);
74 nodemap = dev->getRemoteNodeMap();
79 std::vector<std::shared_ptr<rcg::Device>> devices = rcg::getDevices();
80 ARMARX_INFO <<
"found " << devices.size() <<
" devices";
84 if (dname == d->getID())
86 ARMARX_ERROR <<
"Device: " << d->getID() <<
" !!!(THIS IS THE DEVICE YOU REQUESTED)!!!";
95 ARMARX_INFO <<
"Display name: " << d->getDisplayName();
96 ARMARX_INFO <<
"Access status:" << d->getAccessStatus();
97 ARMARX_INFO <<
"User name: " << d->getUserDefinedName();
98 ARMARX_INFO <<
"Serial number: " << d->getSerialNumber();
100 ARMARX_INFO <<
"TS Frequency: " << d->getTimestampFrequency();
103 ARMARX_ERROR <<
"Please specify the device id. Aborting";
145 const std::string& calibSavePath)
149 if (!rcg::setBoolean(nodemap,
"GevIEEE1588",
true))
151 ARMARX_WARNING <<
"Could not activate Precision Time Protocol (PTP) client!";
154 dimensions.height =
Ice::Int(rcg::getInteger(nodemap,
"Height") / 2.0);
155 dimensions.width =
Ice::Int(rcg::getInteger(nodemap,
"Width"));
158 baseline = rcg::getFloat(nodemap,
"Baseline",
nullptr,
nullptr,
true);
159 focalLengthFactor = rcg::getFloat(nodemap,
"FocalLengthFactor",
nullptr,
nullptr,
false);
160 float focalLength =
float(focalLengthFactor * dimensions.width);
166 std::vector<rcg::StreamPtr> availableStreams = dev->getStreams();
173 if (!availableStreams.size())
180 this->stream = availableStreams[0];
185 cameraImages =
new CByteImage*[numImages];
186 for (
size_t i = 0; i < numImages; i++)
188 cameraImages[i] =
new CByteImage(dimensions.width, dimensions.height, CByteImage::eRGB24);
191 scaleFactor = scalefactor;
192 if (scaleFactor > 1.0)
194 dimensions.height /= scaleFactor;
195 dimensions.width /= scaleFactor;
196 focalLength /= scaleFactor;
199 smallImages =
new CByteImage*[numImages];
200 for (
size_t i = 0; i < numImages; i++)
202 smallImages[i] =
new CByteImage(dimensions.width, dimensions.height, CByteImage::eRGB24);
206 c.SetCameraParameters(focalLength,
208 dimensions.width / 2.0,
209 dimensions.height / 2.0,
219 CStereoCalibration ivtStereoCalibration;
220 ivtStereoCalibration.SetSingleCalibrations(
c,
c);
221 ivtStereoCalibration.rectificationHomographyRight = Math3d::unit_mat;
222 ivtStereoCalibration.rectificationHomographyLeft = Math3d::unit_mat;
224 Vec3d right_translation;
225 right_translation.x = baseline * -1000.0;
226 right_translation.y = 0.0;
227 right_translation.z = 0.0;
228 ivtStereoCalibration.SetExtrinsicParameters(
229 Math3d::unit_mat, Math3d::zero_vec, Math3d::unit_mat, right_translation,
false);
231 ARMARX_INFO <<
"Saving calibration to: " << calibSavePath;
232 ivtStereoCalibration.SaveCameraParameters(calibSavePath.c_str());
239 ARMARX_INFO <<
"Start streaming Roboception Images";
242 stream->startStreaming();
248 ARMARX_INFO <<
"Stop streaming Roboception Images";
249 stream->stopStreaming();
258 stream->stopStreaming();
267 for (
size_t i = 0; i < numImages; i++)
269 delete cameraImages[i];
270 delete smallImages[i];
273 delete[] cameraImages;
274 delete[] smallImages;
280 GenApi::NodeList_t nodeList;
281 nodemap->_GetNodes(nodeList);
283 for (
const auto& node : nodeList)
285 ARMARX_INFO <<
"---- properties of node '" << node->GetName(
true) <<
'\'';
286 GENICAM_NAMESPACE::gcstring_vector properties;
287 node->GetPropertyNames(properties);
288 for (
const auto&
string : properties)
298 const uint8_t* inputPixels,
301 uint64_t pixelFormat,
304 const unsigned char* p = inputPixels;
308 case PfncFormat::Mono8:
309 case PfncFormat::Confidence8:
312 unsigned char const* row = p + (nImage * height) * (width + xpadding);
313 unsigned char* outRow = outputPixels;
314 for (
size_t j = 0; j < height; j++)
316 for (
size_t i = 0; i < width; i++)
318 const unsigned char c = row[i];
319 outRow[3 * i + 0] =
c;
320 outRow[3 * i + 1] =
c;
321 outRow[3 * i + 2] =
c;
326 row += width + xpadding;
330 case PfncFormat::YCbCr411_8:
333 size_t inStride = width * 6 / 4 + xpadding;
334 unsigned char const* row = p + (nImage * height) * inStride;
335 unsigned char* outRow = outputPixels;
337 for (
size_t j = 0; j < height; j++)
339 for (
size_t i = 0; i < width; i++)
341 rcg::convYCbCr411toRGB(rgb, row,
int(i));
342 outRow[i * 3 + 0] = rgb[0];
343 outRow[i * 3 + 1] = rgb[1];
344 outRow[i * 3 + 2] = rgb[2];
353 ARMARX_INFO <<
"Unexpected pixel format: " << int(pixelFormat);
361 const rcg::Image& inputRgb)
363 fillCameraImageRGB(outputPixels,
365 inputRgb.getPixels(),
367 inputRgb.getHeight(),
368 inputRgb.getPixelFormat(),
369 inputRgb.getXPadding());
377 const rcg::Image& disparity,
381 <<
"Upscaling by factors other than 1 or 2 is not implemented.";
386 size_t width = disparity.getWidth();
387 size_t height = disparity.getHeight();
388 bool bigendian = disparity.isBigEndian();
396 const uint8_t* dps = disparity.getPixels();
399 size_t dstep = disparity.getWidth() *
sizeof(uint16_t) + disparity.getXPadding();
404 disparity.getXPadding();
405 unsigned char* outRow = outputPixels;
407 for (
size_t j = 0; j < height; j++)
409 for (
size_t i = 0; i < width; i++)
416 d = scale * ((dps[j] << 8) | dps[j + 1]);
421 d = scale * ((dps[j + 1] << 8) | dps[j]);
424 unsigned char* pixel = &outRow[3 * i * upscale];
430 double z = f * t / d;
433 const double meterToMillimeter = 1000.0;
434 unsigned int depthMM =
static_cast<unsigned int>(std::round(z * meterToMillimeter));
448 unsigned char* nextPixel = pixel + 3;
449 std::memcpy(nextPixel, pixel, 3);
456 unsigned char* nextRow = outRow + width * 3 * upscale;
457 std::memcpy(nextRow, outRow, width * 3 * upscale);
462 outRow += width * 3 * upscale;