多摄像机标定与重叠视图是简单的。然而,我想校准一个多摄像机钻机,没有重叠的观点,这是背对背。我查看了一些资源,发现opencv的手眼校准似乎解决了我的问题。
为了验证我的想法,我假设一个简单的例子,我使用手眼校准来校准立体声相机设置。在我的设计中,两个摄像头构建了一个平台,并面对着相同的机架板。我的目标是找出这两个相机之间的外在特征。
基于OpenCV文档,我创建了如下输入:
pripper ->左侧摄像机;基本-> aruco板;目标->相同板;凸轮->右摄像头;board2leftCam或board2rightCam可以使用aruco::估值波塞板()
操作步骤:
R_gripper2base -> board2leftCam.inv();
R_target2cam -> board2rightCam.
R_cam2gripper -> right2left. 输出应该是cam2gripper ->右摄像机到左摄像机。但是的结果与立体声校准的结果有很大的不同。
为什么我的校准结果是错误的?提前谢谢你!
我的守则:
/*
* R_lefCam2Board => R_gripper2base
*/
std::vector<cv::Mat> rvecMat_lefCam2Board, tvecMat_lefCam2Board;
for (size_t i = 0; i < lefCamfilenames.size(); ++i) {
cv::Mat matLef = cv::imread(lefCamfilenames[i]);
vector<int> ids;
vector<vector<Point2f>> corners, rejected;
aruco::detectMarkers(matLef, dictionary, corners, ids, params, rejected);
cv::Vec3d rvec, tvec; // from floor 2 bot camera
aruco::estimatePoseBoard(corners, ids, board, botCam.mtx, botCam.dist, rvec, tvec);
cv::Mat pose = vec3d2Mat44(rvec, tvec); // pose is double
cv::Mat pose_inv = pose.inv();
pose_inv.convertTo(pose_inv, CV_32F);
cv::Mat R_lefCam2Board, T_lefCam2Board;
mat44ToRT_(pose_inv, R_lefCam2Board, T_lefCam2Board);
rvecMat_lefCam2Board.push_back(R_lefCam2Board);
tvecMat_lefCam2Board.push_back(T_lefCam2Board);
}
/*
* R_Board2botCam => R_target2cam
*/
std::vector<cv::Mat> rvecMat_board2botCam, tvecMat_board2botCam;
for (size_t i = 0; i < botCamfilenames.size(); ++i) {
cv::Mat matBot = cv::imread(botCamfilenames[i]);
vector<int> ids;
vector<vector<Point2f>> corners, rejected;
aruco::detectMarkers(matBot, dictionary, corners, ids, params, rejected);
cv::Vec3d rvec, tvec; // from floor 2 bot camera
aruco::estimatePoseBoard(corners, ids, board, botCam.mtx, botCam.dist, rvec, tvec);
cv::Mat pose = vec3d2Mat44(rvec, tvec); // pose is double
pose.convertTo(pose, CV_32F);
cv::Mat R_bot2floor, T_bot2floor;
mat44ToRT_(pose_inv, R_bot2floor, T_bot2floor);
rvecMat_board2botCam.push_back(R_bot2floor);
tvecMat_board2botCam.push_back(T_bot2floor);
}
/*
* Calculate result R_Bot2Left => R_cam2gripper
*/
cv::Mat R_bot2lef, T_bot2lef;
cv::calibrateHandEye(rvecMat_lefCam2Board, tvecMat_lefCam2Board,
rvecMat_board2botCam, tvecMat_board2botCam,
R_bot2lef, T_bot2lef);发布于 2022-11-23 12:52:01
发布于 2022-07-11 01:14:29
要在外部校准多个没有重叠视图的摄像机(即找到它们的位置和相对于彼此的方向),您需要在所有相机中观察到一个共同的参考对象(即a)。(“校准目标”),或已知形状、位置和方位的一组物体。
这可以通过以下几种方式实现:
关键是你需要在所有图像中“看到”一些东西,从中你可以推断出相机的方向和位置,而这个东西必须出现在相机中,这样才有可能把这些位置和方向联系起来。
https://stackoverflow.com/questions/72921136
复制相似问题