编译k4a-calibration报错:Aruco字典受保护访问限制
k4a-calibration项目编译失败修复方案
问题描述
编译k4a-calibration项目时出现如下错误:
[ 33%] Building CXX object CMakeFiles/calib_k4a.dir/src/camera_extrinsics.cpp.o /home/ccnam/Downloads/k4a-calibration/src/camera_extrinsics.cpp: In member function ‘bool ExtrinsicsCalibration::CalculateExtrinsics(const std::vector<FrameInfo>&, std::vector<AlignmentTransform>&)’: /home/ccnam/Downloads/k4a-calibration/src/camera_extrinsics.cpp:213:51: error: ‘cv::Ptr<cv::aruco::Dictionary> cv::aruco::Board::dictionary’ is protected within this context cv::aruco::detectMarkers(gray, board->dictionary, markerCorners, markerIds, params); ^~~~~~~~~~ In file included from /usr/local/include/opencv4/opencv2/aruco_detector.hpp:6:0, from /usr/local/include/opencv4/opencv2/aruco.hpp:7, from /usr/local/include/opencv4/opencv2/aruco/charuco.hpp:9, from /home/ccnam/Downloads/k4a-calibration/include/camera_extrinsics.hpp:11, from /home/ccnam/Downloads/k4a-calibration/src/camera_extrinsics.cpp:1: /usr/local/include/opencv4/opencv2/aruco/board.hpp:89:29: note: declared protected here CV_PROP Ptr<Dictionary> dictionary; ^~~~~~~~~~ CMakeFiles/calib_k4a.dir/build.make:75: recipe for target 'CMakeFiles/calib_k4a.dir/src/camera_extrinsics.cpp.o' failed make[2]: *** [CMakeFiles/calib_k4a.dir/src/camera_extrinsics.cpp.o] Error 1 CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/calib_k4a.dir/all' failed make[1]: *** [CMakeFiles/calib_k4a.dir/all] Error 2 Makefile:90: recipe for target 'all' failed make: *** [all] Error 2
操作步骤
执行以下命令后触发编译错误:
git clone https://github.com/stytim/k4a-calibration.git cd k4a-calibration mkdir build && cd build cmake .. make
运行环境
Ubuntu 18.04
错误原因
项目代码直接访问了OpenCV中cv::aruco::Board类的protected成员dictionary,而高版本OpenCV(如当前使用的OpenCV4)限制了该成员的访问权限,不允许外部直接调用。
修复方法
修改src/camera_extrinsics.cpp文件第213行的代码,将直接访问board->dictionary替换为调用Board类提供的公共接口getDictionary():
原代码:
cv::aruco::detectMarkers(gray, board->dictionary, markerCorners, markerIds, params);
修改后代码:
cv::aruco::detectMarkers(gray, board->getDictionary(), markerCorners, markerIds, params);
修改完成后,重新执行make命令即可完成编译。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

