Skip to content

Commit 5db9c98

Browse files
authored
Merge pull request #1478 from luxonis/v3_dcl_refactorCodebase
V3 dcl refactor codebase; usage of resolution
2 parents 12e7f33 + f03d208 commit 5db9c98

File tree

3 files changed

+61
-60
lines changed

3 files changed

+61
-60
lines changed

include/depthai/pipeline/node/DynamicCalibrationNode.hpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -132,22 +132,6 @@ class DynamicCalibration : public DeviceNodeCRTP<DeviceNode, DynamicCalibration,
132132

133133
void run() override;
134134

135-
int getWidth() const {
136-
return width;
137-
}
138-
139-
int getHeight() const {
140-
return height;
141-
}
142-
143-
void setWidth(const int newWidth) {
144-
width = newWidth;
145-
}
146-
147-
void setHeight(const int newHeight) {
148-
height = newHeight;
149-
}
150-
151135
CameraBoardSocket getBorderSockerA() {
152136
return daiSocketA;
153137
}
@@ -187,8 +171,8 @@ class DynamicCalibration : public DeviceNodeCRTP<DeviceNode, DynamicCalibration,
187171

188172
CameraBoardSocket daiSocketA = CameraBoardSocket::CAM_B;
189173
CameraBoardSocket daiSocketB = CameraBoardSocket::CAM_C;
190-
int width;
191-
int height;
174+
std::pair<int, int> resolutionA;
175+
std::pair<int, int> resolutionB;
192176
std::shared_ptr<::spdlog::async_logger> logger;
193177

194178
// std::chrono::milliseconds sleepingTime = 250ms;

src/pipeline/node/DynamicCalibrationNode.cpp

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,6 @@
1515
namespace dai {
1616
namespace 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-
3518
class 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)
9999
std::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
240240
void 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

248248
DynamicCalibration::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

272272
DynamicCalibration::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

350355
DynamicCalibration::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);

src/pipeline/node/DynamicCalibrationUtils.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ struct DclUtils {
1414
const std::shared_ptr<const dcl::CameraCalibrationHandle> dclCalibrationB,
1515
const CameraBoardSocket socketSrc,
1616
const CameraBoardSocket socketDest,
17-
const int width,
18-
const int height);
17+
const std::pair<int, int> resolutionA,
18+
const std::pair<int, int> resolutionB);
1919

2020
static std::shared_ptr<dcl::CameraCalibrationHandle> createDclCalibration(const std::vector<std::vector<float>> cameraMatrix,
2121
const std::vector<float> distortionCoefficients,
@@ -26,10 +26,12 @@ struct DclUtils {
2626
const CalibrationHandler& currentCalibration,
2727
const CameraBoardSocket boardSocketA,
2828
const CameraBoardSocket boardSocketB,
29-
const int width,
30-
const int height);
29+
const std::pair<int, int> resolutionA,
30+
const std::pair<int, int> resolutionB);
3131

3232
static dcl::ImageData cvMatToImageData(const cv::Mat& mat);
33+
34+
static dcl::PerformanceMode daiPerformanceModeToDclPerformanceMode(const dai::DynamicCalibrationControl::PerformanceMode mode);
3335
};
3436

3537
} // namespace node

0 commit comments

Comments
 (0)