Fixing ChArUco board support on opencv >= 4.7.0 (#1331)

Fixed https://github.com/introlab/rtabmap_ros/issues/1200
This commit is contained in:
matlabbe
2024-08-25 19:35:19 -07:00
committed by GitHub
parent 6ce85b4e55
commit 4df207acc3
4 changed files with 32 additions and 6 deletions

View File

@@ -597,7 +597,8 @@ void matchCharucoImagePoints(
objectPoints.push_back(board.chessboardCorners[pointId]);
}
#else
board.matchImagePoints(detectedCorners, detectedIds, objectPoints, cv::noArray());
cv::Mat imgPts;
board.matchImagePoints(detectedCorners, detectedIds, objectPoints, imgPts);
#endif
}
#endif
@@ -753,16 +754,32 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat &
UASSERT(charucoBoard_.get());
// detect markers
UDEBUG("Detecting aruco markers...");
#if CV_MAJOR_VERSION > 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION >= 7)
UASSERT(arucoDetector_.get());
arucoDetector_->detectMarkers(timg, markerCorners, markerIds, rejected);
#else
cv::aruco::detectMarkers(timg, markerDictionary_, markerCorners, markerIds, arucoDetectorParams_, rejected);
#endif
// refine strategy to detect more markers
UDEBUG("Refining aruco markers...");
#if CV_MAJOR_VERSION > 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION >= 7)
arucoDetector_->refineDetectedMarkers(timg, *charucoBoard_, markerCorners, markerIds, rejected);
#else
cv::aruco::refineDetectedMarkers(timg, charucoBoard_, markerCorners, markerIds, rejected);
#endif
// interpolate charuco corners
UDEBUG("Finding charuco corners (markers=%ld)...", markerCorners.size());
if(markerIds.size() > 0)
{
UASSERT(markerIds.size() == markerCorners.size());
#if CV_MAJOR_VERSION > 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION >= 7)
UASSERT(charucoDetector_.get());
charucoDetector_->detectBoard(timg, pointBuf[id], pointIds[id], markerCorners, markerIds);
#else
cv::aruco::interpolateCornersCharuco(markerCorners, markerIds, timg, charucoBoard_, pointBuf[id], pointIds[id], cv::noArray(), cv::noArray(), 1);
#endif
UDEBUG("Found %ld charuco corners (requires 12)", pointBuf[id].size());
if(pointBuf[id].size() >= 12) {
// Match image points
matchCharucoImagePoints(*charucoBoard_, pointBuf[id], pointIds[id], objectBuf[id]);
@@ -1273,6 +1290,8 @@ void CalibrationDialog::restart()
ui_->doubleSpinBox_markerLength->value(),
*markerDictionary_));
charucoBoard_->setLegacyPattern(ui_->comboBox_board_type->currentIndex()==1);
arucoDetector_.reset(new cv::aruco::ArucoDetector(*markerDictionary_, *arucoDetectorParams_));
charucoDetector_.reset(new cv::aruco::CharucoDetector(*charucoBoard_, cv::aruco::CharucoParameters(), *arucoDetectorParams_));
#else
charucoBoard_ = cv::aruco::CharucoBoard::create(
ui_->spinBox_boardWidth->value(),