双相机坐标系标定

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

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;

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年7月28日
下一篇 2023年7月28日

相关推荐