赞
踩
在工业应用中,常常会遇到双相机定位的项目,下面就介绍双相机如何标定才能做到精准定位。
如上图所示,玻璃上对角有两个mark点,由于mark点的间距太远只能用两个相机去拍。
两个相机分别拍产品的对角。
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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。