首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于手眼标定的非重叠多摄像机标定

基于手眼标定的非重叠多摄像机标定
EN

Stack Overflow用户
提问于 2022-07-09 11:53:34
回答 2查看 169关注 0票数 1

多摄像机标定与重叠视图是简单的。然而,我想校准一个多摄像机钻机,没有重叠的观点,这是背对背。我查看了一些资源,发现opencv的手眼校准似乎解决了我的问题。

为了验证我的想法,我假设一个简单的例子,我使用手眼校准来校准立体声相机设置。在我的设计中,两个摄像头构建了一个平台,并面对着相同的机架板。我的目标是找出这两个相机之间的外在特征。

基于OpenCV文档,我创建了如下输入:

pripper ->左侧摄像机;基本-> aruco板;目标->相同板;凸轮->右摄像头;board2leftCam或board2rightCam可以使用aruco::估值波塞板()

操作步骤:

代码语言:javascript
复制
R_gripper2base -> board2leftCam.inv();
R_target2cam -> board2rightCam.
R_cam2gripper -> right2left. 

输出应该是cam2gripper ->右摄像机到左摄像机。但是的结果与立体声校准的结果有很大的不同。

为什么我的校准结果是错误的?提前谢谢你!

我的守则:

代码语言:javascript
复制
/*
* 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);
EN

回答 2

Stack Overflow用户

发布于 2022-11-23 12:52:01

如果您有相机校准问题,没有重叠的视野,那么您可以,例如,使用

CALICO是基于一种类似的方法,您正试图这样做。他们首先使用手眼校准来确定姿势的粗略估计,然后使用束平和再投影误差来细化。

票数 1
EN

Stack Overflow用户

发布于 2022-07-11 01:14:29

要在外部校准多个没有重叠视图的摄像机(即找到它们的位置和相对于彼此的方向),您需要在所有相机中观察到一个共同的参考对象(即a)。(“校准目标”),或已知形状、位置和方位的一组物体。

这可以通过以下几种方式实现:

  • 有一个固定的物体,一次可以在一个摄像机中观察到,而钻机以已知的运动被移动到,使物体在每个摄像机中依次变得可见。例如:安装在转盘上的摄像机,旋转到向每个摄像机“呈现”一个校准目标。
  • 它是一个固定的物体,足够大,它的不同部分可以在所有相机中被观察到,并且这些部分之间的几何关系是已知的。所有的照相机都在看夜空,观测到的起始/星座的星历是已知的。

关键是你需要在所有图像中“看到”一些东西,从中你可以推断出相机的方向和位置,而这个东西必须出现在相机中,这样才有可能把这些位置和方向联系起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72921136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档