在工业应用中,常常会遇到双相机定位的项目,下面就介绍双相机如何标定才能做到精准定位。
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;
文章出处登录后可见!
已经登录?立即刷新