当前位置:   article > 正文

双相机坐标系标定_双相机标定

双相机标定

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

1,产品

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

2,相机布局

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

3,标定流程

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

opencv计算出其中一个矩阵 M

  1. std::vector<cv::Point2f> camera;
  2. std::vector<cv::Point2f> robot;
  3. camera.push_back(cv::Point2f(153.5 , 781.5));
  4. camera.push_back(cv::Point2f(580.5 , 783.5));
  5. camera.push_back(cv::Point2f(1006.5 , 784.5));
  6. camera.push_back(cv::Point2f(153.5 , 436.5));
  7. camera.push_back(cv::Point2f(581.5 , 435.5 ));
  8. camera.push_back(cv::Point2f(1008.5 , 438.5));
  9. camera.push_back(cv::Point2f(154.5 , 90.5));
  10. camera.push_back(cv::Point2f(581.5 , 89.5));
  11. camera.push_back(cv::Point2f(1008.5 , 91.5));
  12. robot.push_back(cv::Point2f(552348 , 541607));
  13. robot.push_back(cv::Point2f(555548 , 541607));
  14. robot.push_back(cv::Point2f(558748 , 541607));
  15. robot.push_back(cv::Point2f(552348 , 544207));
  16. robot.push_back(cv::Point2f(555548 , 544207));
  17. robot.push_back(cv::Point2f(558748 , 544207));
  18. robot.push_back(cv::Point2f( 552348 , 546807));
  19. robot.push_back(cv::Point2f( 555548 , 546807 ));
  20. robot.push_back(cv::Point2f(558748 , 546807));
  21. cv::Mat matrix = cv::estimateAffine2D(camera,robot);
  22. A = matrix.ptr<double>(0)[0];
  23. B = matrix.ptr<double>(0)[1];
  24. C = matrix.ptr<double>(0)[2];
  25. D = matrix.ptr<double>(1)[0];
  26. E = matrix.ptr<double>(1)[1];
  27. F = matrix.ptr<double>(1)[2];

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

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

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,

  1. vector_angle_to_rigid(P_1.X, P_1.y, 0,P_1.X, P_1.y, A, HomMat2D)
  2. affine_trans_pixel(HomMat2D, Row2, Column2, RowTrans, ColTrans)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/297403
推荐阅读
相关标签
  

闽ICP备14008679号