1515namespace dai {
1616namespace node {
1717
18- dcl::PerformanceMode daiPerformanceModeToDclPerformanceMode (dai::DynamicCalibrationControl::PerformanceMode mode) {
19- switch (mode) {
20- case DynamicCalibrationControl::PerformanceMode::DEFAULT:
21- return dcl::PerformanceMode::DEFAULT;
22- case DynamicCalibrationControl::PerformanceMode::STATIC_SCENERY:
23- return dcl::PerformanceMode::STATIC_SCENERY;
24- case DynamicCalibrationControl::PerformanceMode::OPTIMIZE_SPEED:
25- return dcl::PerformanceMode::OPTIMIZE_SPEED;
26- case DynamicCalibrationControl::PerformanceMode::OPTIMIZE_PERFORMANCE:
27- return dcl::PerformanceMode::OPTIMIZE_PERFORMANCE;
28- case DynamicCalibrationControl::PerformanceMode::SKIP_CHECKS:
29- return dcl::PerformanceMode::SKIP_CHECKS;
30- default :
31- throw std::invalid_argument (" Unknown PerformanceMode" );
32- }
33- }
34-
3518class DynamicCalibration ::Impl {
3619 public:
3720 /* *
@@ -72,11 +55,11 @@ std::pair<std::shared_ptr<dcl::CameraCalibrationHandle>, std::shared_ptr<dcl::Ca
7255 const CalibrationHandler& currentCalibration,
7356 const CameraBoardSocket boardSocketA,
7457 const CameraBoardSocket boardSocketB,
75- const int width ,
76- const int height ) {
58+ const std::pair< int , int > resolutionA ,
59+ const std::pair< int , int > resolutionB ) {
7760 // clang-format off
7861 std::shared_ptr<dcl::CameraCalibrationHandle> calibA = DclUtils::createDclCalibration (
79- currentCalibration.getCameraIntrinsics (boardSocketA, width, height ),
62+ currentCalibration.getCameraIntrinsics (boardSocketA, resolutionA. first , resolutionA. second , Point2f (), Point2f (), false ),
8063 currentCalibration.getDistortionCoefficients (boardSocketA),
8164 {
8265 {1 .0f , 0 .0f , 0 .0f },
@@ -86,7 +69,7 @@ std::pair<std::shared_ptr<dcl::CameraCalibrationHandle>, std::shared_ptr<dcl::Ca
8669 {0 .0f , 0 .0f , 0 .0f }
8770 );
8871 std::shared_ptr<dcl::CameraCalibrationHandle> calibB = DclUtils::createDclCalibration (
89- currentCalibration.getCameraIntrinsics (boardSocketB, width, height ),
72+ currentCalibration.getCameraIntrinsics (boardSocketB, resolutionB. first , resolutionB. second , Point2f (), Point2f (), false ),
9073 currentCalibration.getDistortionCoefficients (boardSocketB),
9174 currentCalibration.getCameraRotationMatrix (boardSocketA, boardSocketB),
9275 currentCalibration.getCameraTranslationVector (boardSocketA, boardSocketB, false )
@@ -95,6 +78,23 @@ std::pair<std::shared_ptr<dcl::CameraCalibrationHandle>, std::shared_ptr<dcl::Ca
9578 return std::make_pair (calibA, calibB);
9679}
9780
81+ dcl::PerformanceMode DclUtils::daiPerformanceModeToDclPerformanceMode (const dai::DynamicCalibrationControl::PerformanceMode mode) {
82+ switch (mode) {
83+ case DynamicCalibrationControl::PerformanceMode::DEFAULT:
84+ return dcl::PerformanceMode::DEFAULT;
85+ case DynamicCalibrationControl::PerformanceMode::STATIC_SCENERY:
86+ return dcl::PerformanceMode::STATIC_SCENERY;
87+ case DynamicCalibrationControl::PerformanceMode::OPTIMIZE_SPEED:
88+ return dcl::PerformanceMode::OPTIMIZE_SPEED;
89+ case DynamicCalibrationControl::PerformanceMode::OPTIMIZE_PERFORMANCE:
90+ return dcl::PerformanceMode::OPTIMIZE_PERFORMANCE;
91+ case DynamicCalibrationControl::PerformanceMode::SKIP_CHECKS:
92+ return dcl::PerformanceMode::SKIP_CHECKS;
93+ default :
94+ throw std::invalid_argument (" Unknown PerformanceMode" );
95+ }
96+ }
97+
9898#define DCL_DISTORTION_SIZE (14 )
9999std::shared_ptr<dcl::CameraCalibrationHandle> DclUtils::createDclCalibration (const std::vector<std::vector<float >> cameraMatrix,
100100 const std::vector<float > distortionCoefficients,
@@ -135,8 +135,8 @@ void DclUtils::convertDclCalibrationToDai(CalibrationHandler& calibHandler,
135135 const std::shared_ptr<const dcl::CameraCalibrationHandle> dclCalibrationB,
136136 const CameraBoardSocket socketSrc,
137137 const CameraBoardSocket socketDest,
138- const int width ,
139- const int height ) {
138+ const std::pair< int , int > resolutionA ,
139+ const std::pair< int , int > resolutionB ) {
140140 dcl::scalar_t tvecA[3 ];
141141 dclCalibrationA->getTvec (tvecA);
142142 dcl::scalar_t rvecA[3 ];
@@ -190,8 +190,8 @@ void DclUtils::convertDclCalibrationToDai(CalibrationHandler& calibHandler,
190190 dclCalibrationB->getRvec (rvecB);
191191 auto rotationMatrix = matrix::rvecToRotationMatrix (rvecB);
192192
193- calibHandler.setCameraIntrinsics (socketSrc, matA, width, height );
194- calibHandler.setCameraIntrinsics (socketDest, matB, width, height );
193+ calibHandler.setCameraIntrinsics (socketSrc, matA, resolutionA. first , resolutionA. second );
194+ calibHandler.setCameraIntrinsics (socketDest, matB, resolutionB. first , resolutionB. second );
195195 calibHandler.setDistortionCoefficients (socketSrc, std::vector<float >(distortionA, distortionA + 14 ));
196196 calibHandler.setDistortionCoefficients (socketDest, std::vector<float >(distortionB, distortionB + 14 ));
197197 auto specTranslation = calibHandler.getCameraTranslationVector (socketSrc, socketDest, true );
@@ -240,13 +240,13 @@ dai::CalibrationQuality calibQualityfromDCL(const dcl::CalibrationDifference& sr
240240void DynamicCalibration::setCalibration (CalibrationHandler& handler) {
241241 logger->info (" Applying calibration to device: {}" , pimplDCL->deviceName );
242242 device->setCalibration (handler);
243- auto [calibA, calibB] = DclUtils::convertDaiCalibrationToDcl (handler, daiSocketA, daiSocketB, width, height );
243+ auto [calibA, calibB] = DclUtils::convertDaiCalibrationToDcl (handler, daiSocketA, daiSocketB, resolutionA, resolutionB );
244244 pimplDCL->dynCalibImpl .setNewCalibration (pimplDCL->deviceName , pimplDCL->socketA , calibA->getCalibration ());
245245 pimplDCL->dynCalibImpl .setNewCalibration (pimplDCL->deviceName , pimplDCL->socketB , calibB->getCalibration ());
246246}
247247
248248DynamicCalibration::ErrorCode DynamicCalibration::runQualityCheck (const bool force) {
249- dcl::PerformanceMode pm = force ? dcl::PerformanceMode::SKIP_CHECKS : daiPerformanceModeToDclPerformanceMode (performanceMode);
249+ dcl::PerformanceMode pm = force ? dcl::PerformanceMode::SKIP_CHECKS : DclUtils:: daiPerformanceModeToDclPerformanceMode (performanceMode);
250250 logger->info (" Running calibration quality check (force={} mode={})" , force, static_cast <int >(pm));
251251
252252 auto dclResult = pimplDCL->dynCalibImpl .checkCalibration (pimplDCL->dcDevice , pimplDCL->socketA , pimplDCL->socketB , pm);
@@ -270,7 +270,7 @@ DynamicCalibration::ErrorCode DynamicCalibration::runQualityCheck(const bool for
270270}
271271
272272DynamicCalibration::ErrorCode DynamicCalibration::runCalibration (const dai::CalibrationHandler& currentHandler, const bool force) {
273- dcl::PerformanceMode pm = force ? dcl::PerformanceMode::SKIP_CHECKS : daiPerformanceModeToDclPerformanceMode (performanceMode);
273+ dcl::PerformanceMode pm = force ? dcl::PerformanceMode::SKIP_CHECKS : DclUtils:: daiPerformanceModeToDclPerformanceMode (performanceMode);
274274 logger->info (" Running calibration (force={} mode={})" , force, static_cast <int >(pm));
275275 auto dclResult = pimplDCL->dynCalibImpl .findNewCalibration (pimplDCL->dcDevice , pimplDCL->socketA , pimplDCL->socketB , pm);
276276 if (!dclResult.passed ()) {
@@ -287,7 +287,7 @@ DynamicCalibration::ErrorCode DynamicCalibration::runCalibration(const dai::Cali
287287 auto newCalibrationHandler = currentHandler;
288288
289289 dai::node::DclUtils::convertDclCalibrationToDai (
290- newCalibrationHandler, dclCalibrationA, dclCalibrationB, daiSocketA, daiSocketB, width, height );
290+ newCalibrationHandler, dclCalibrationA, dclCalibrationB, daiSocketA, daiSocketB, resolutionA, resolutionB );
291291
292292 CalibrationQuality::Data qualityData{};
293293 qualityData.rotationChange [0 ] = dclResult.value .calibrationDifference ->rotationChange [0 ];
@@ -335,7 +335,12 @@ DynamicCalibration::ErrorCode DynamicCalibration::runLoadImage(const bool blocki
335335 auto leftCvFrame = leftFrame->getCvFrame ();
336336 auto rightCvFrame = rightFrame->getCvFrame ();
337337
338- logger->info (" Loaded stereo image pair: {}x{} @ timestamp={}" , leftFrame->getWidth (), leftFrame->getHeight (), timestamp);
338+ logger->info (" Loaded stereo image pair: {}x{} and {}x{} @ timestamp={}" ,
339+ leftFrame->getWidth (),
340+ leftFrame->getHeight (),
341+ rightFrame->getWidth (),
342+ rightFrame->getHeight (),
343+ timestamp);
339344
340345 pimplDCL->dynCalibImpl .loadStereoImagePair (DclUtils::cvMatToImageData (leftCvFrame),
341346 DclUtils::cvMatToImageData (rightCvFrame),
@@ -348,7 +353,8 @@ DynamicCalibration::ErrorCode DynamicCalibration::runLoadImage(const bool blocki
348353}
349354
350355DynamicCalibration::ErrorCode DynamicCalibration::computeCoverage () {
351- auto resultCoverage = pimplDCL->dynCalibImpl .computeCoverage (pimplDCL->sensorA , pimplDCL->sensorB , daiPerformanceModeToDclPerformanceMode (performanceMode));
356+ auto resultCoverage =
357+ pimplDCL->dynCalibImpl .computeCoverage (pimplDCL->sensorA , pimplDCL->sensorB , DclUtils::daiPerformanceModeToDclPerformanceMode (performanceMode));
352358
353359 if (!resultCoverage.passed ()) {
354360 throw std::runtime_error (" Coverage check failed!" );
@@ -383,8 +389,10 @@ DynamicCalibration::ErrorCode DynamicCalibration::initializePipeline(const std::
383389 return DynamicCalibration::ErrorCode::PIPELINE_INITIALIZATION_FAILED;
384390 }
385391
386- width = leftFrame->getWidth ();
387- height = rightFrame->getHeight ();
392+ resolutionA.first = leftFrame->getWidth ();
393+ resolutionA.second = leftFrame->getHeight ();
394+ resolutionB.first = rightFrame->getWidth ();
395+ resolutionB.second = rightFrame->getHeight ();
388396
389397 daiSocketA = static_cast <CameraBoardSocket>(leftFrame->instanceNum );
390398 daiSocketB = static_cast <CameraBoardSocket>(rightFrame->instanceNum );
@@ -393,7 +401,13 @@ DynamicCalibration::ErrorCode DynamicCalibration::initializePipeline(const std::
393401 return DynamicCalibration::ErrorCode::PIPELINE_INITIALIZATION_FAILED;
394402 }
395403
396- logger->info (" Detected sockets: A={} B={}, resolution={}x{}" , static_cast <int >(daiSocketA), static_cast <int >(daiSocketB), width, height);
404+ logger->info (" Detected sockets: A={} B={}, resolution={}x{} resolution{}x{}" ,
405+ static_cast <int >(daiSocketA),
406+ static_cast <int >(daiSocketB),
407+ resolutionA.first ,
408+ resolutionA.second ,
409+ resolutionB.first ,
410+ resolutionB.second );
397411
398412 pimplDCL->socketA = static_cast <dcl::socket_t >(daiSocketA);
399413 pimplDCL->socketB = static_cast <dcl::socket_t >(daiSocketB);
@@ -406,15 +420,16 @@ DynamicCalibration::ErrorCode DynamicCalibration::initializePipeline(const std::
406420 if (platform == dai::Platform::RVC2 && (!eepromData.stereoEnableDistortionCorrection || eepromData.stereoUseSpecTranslation )) {
407421 throw std::runtime_error (" The calibration on the device is too old to perform DynamicCalibration, full re-calibration required!" );
408422 }
409- auto [calibA, calibB] = DclUtils::convertDaiCalibrationToDcl (calibrationHandler, daiSocketA, daiSocketB, width, height );
423+ auto [calibA, calibB] = DclUtils::convertDaiCalibrationToDcl (calibrationHandler, daiSocketA, daiSocketB, resolutionA, resolutionB );
410424
411425 // set up the dynamic calibration
412426 pimplDCL->deviceName = daiDevice->getDeviceId ();
413427 pimplDCL->dcDevice = pimplDCL->dynCalibImpl .addDevice (pimplDCL->deviceName );
414- dcl::resolution_t resolution{static_cast <unsigned >(width), static_cast <unsigned >(height)};
428+ dcl::resolution_t resolutionDclA{static_cast <unsigned >(resolutionA.first ), static_cast <unsigned >(resolutionA.second )};
429+ dcl::resolution_t resolutionDclB{static_cast <unsigned >(resolutionB.first ), static_cast <unsigned >(resolutionB.second )};
415430
416- pimplDCL->sensorA = std::make_shared<dcl::CameraSensorHandle>(calibA, resolution );
417- pimplDCL->sensorB = std::make_shared<dcl::CameraSensorHandle>(calibB, resolution );
431+ pimplDCL->sensorA = std::make_shared<dcl::CameraSensorHandle>(calibA, resolutionDclA );
432+ pimplDCL->sensorB = std::make_shared<dcl::CameraSensorHandle>(calibB, resolutionDclB );
418433 logger->info (" Added sensors for sockets A={} and B={} to dynCalibImpl" , static_cast <int >(pimplDCL->socketA ), static_cast <int >(pimplDCL->socketB ));
419434
420435 pimplDCL->dynCalibImpl .addSensor (pimplDCL->deviceName , pimplDCL->sensorA , pimplDCL->socketA );
0 commit comments