双相机坐标系标定

2 篇文章 0 订阅

在工业应用中,常常会遇到双相机定位的项目,下面就介绍双相机如何标定才能做到精准定位。

1,产品

 如上图所示,玻璃上对角有两个mark点,由于mark点的间距太远只能用两个相机去拍。

2,相机布局

 两个相机分别拍产品的对角。

3,标定流程

  1,根据n点标的规则获取 n组数据,做放射变换算出两个相机的M1,M2

opencv计算出其中一个矩阵 M

 
    std::vector<cv::Point2f> camera;
    std::vector<cv::Point2f> robot;
    camera.push_back(cv::Point2f(153.5 , 781.5));
    camera.push_back(cv::Point2f(580.5 , 783.5));
    camera.push_back(cv::Point2f(1006.5 , 784.5));
 
    camera.push_back(cv::Point2f(153.5 , 436.5));
    camera.push_back(cv::Point2f(581.5 , 435.5 ));
    camera.push_back(cv::Point2f(1008.5 , 438.5));
 
    camera.push_back(cv::Point2f(154.5 , 90.5));
    camera.push_back(cv::Point2f(581.5 , 89.5));
    camera.push_back(cv::Point2f(1008.5 , 91.5));
 
 
 
    robot.push_back(cv::Point2f(552348 , 541607));
    robot.push_back(cv::Point2f(555548 , 541607));
    robot.push_back(cv::Point2f(558748 , 541607));
 
    robot.push_back(cv::Point2f(552348 , 544207));
    robot.push_back(cv::Point2f(555548 , 544207));
    robot.push_back(cv::Point2f(558748 , 544207));
 
    robot.push_back(cv::Point2f( 552348 , 546807));
    robot.push_back(cv::Point2f( 555548 , 546807 ));
    robot.push_back(cv::Point2f(558748 , 546807));

    cv::Mat matrix = cv::estimateAffine2D(camera,robot);
    A = matrix.ptr<double>(0)[0];
    B = matrix.ptr<double>(0)[1];
    C = matrix.ptr<double>(0)[2];
 
    D = matrix.ptr<double>(1)[0];
    E = matrix.ptr<double>(1)[1];
    F = matrix.ptr<double>(1)[2];

用样的方法可以计算出矩阵 M2,然后在拍照位的任意一个像素坐标都可以通过M1和M2变换成轴坐标,这样就将两个相机标定到同一个坐标系了。

 
QPair<float, float> MainWindow::getRobotPosition(float x, float y)
{
    QPair<float,float> pair;
    pair.first = (A*x) + B* y + C;
    pair.second = (D*x) + E* y + F;
    return pair;
}
 

2,计算出旋转中心,注意这里的旋转中心,指的是旋转轴的中心,并不一定是产品的中心,具体方法:让其其中一个mark点旋转n个角度(三个以上),得到n组坐标,拟合成一个圆从而得到圆心坐标。

3,做一个参考模板(这里的模板并不是模板匹配里的模板,只是个参考位置,一般在拍照位,让mark点位于视野中心),拍一次得到两个mark点连的角度A,和两个mark点的坐标P1和P2.

4,以上准备工作全部做完了,当产品来时拍一次产品,的到两个mark点的坐标P_1, P_2,算出角度A_1          角度差(A - A_1),然后计算出产品旋转(A - A_1)后的新落点P_1_1, 和 P_2_2,


vector_angle_to_rigid(P_1.X, P_1.y, 0,P_1.X, P_1.y, A, HomMat2D)

affine_trans_pixel(HomMat2D, Row2, Column2, RowTrans, ColTrans)

计算出P_1新的落脚点,Offect  = P1.x - P_1.x  ,  P1.y - P_1.y;

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值