zoukankan      html  css  js  c++  java
  • 机械手相机9点坐标标定-基于C#+EmguCV

            很多初学者,都对标定概念模糊不清,分不清坐标系之间的关系,搞不清相机标定和机械手相机标定有什么关系,想当初自己也是一个人摸索了很久,本文将尽量给大家解释。

             我们通常所说的相机标定分为两种,一种是相机参数的标定,这一般用到张氏标定法标定的作用是校正相机自身的畸变,利用校正得到的参数对图形进行处理后再呈现出来。关于这方面的资料,网上大把,我也不再此说明。一般的机械手定位也不会进行这个标定,因为现在的相机畸变还是很小的,精度可以满足大多数要求。

            本文要介绍的是第二种,相机和机械手之间的标定,作用:建立相机坐标系和机械手坐标系之间的关系,即给机械手装上眼睛,让它去哪就去哪。

             常用的方法是9点标定,所用到函数是EstimateRigidTransform,网上关于 estimateRigidTransform 的详细说明很少,Emgucv的几乎没有。当时找了N久,一度以为opencv没有坐标系转换的算法,差点就投奔halcon去了,不得不说,opencv在机器视觉方面的应用是完全不如halcon的。EstimateRigidTransform有两个方法。

               方法一:Mat EstimateRigidTransform(PointF[] sourcePoints, PointF[] destinationPoints, bool fullAffine);返回的是一个2*3的double的矩阵 。

    第一个参数sourcePoints:换之前图像上的点(相机坐标系下的点)

    第二个参数destinationPoints:换之后图像上的点(机械手坐标系下的点)

    第三个参数fullAffine:  TRUE(全仿射变换,包括:rotation, translation, scaling,shearing,reflection)

                                          FALSE(带有约束的仿射变换) 

               方法二:Mat EstimateRigidTransform(IInputArray src, IInputArray dst, bool fullAffine);   //返回的是图像

    第一个参数src:变换之前的图像

    第二个参数dst:变换之前的图像

    第三个参数fullAffine:  TRUE(全仿射变换,包括:rotation, translation, scaling,shearing,reflection)

                                          FALSE(带有约束的仿射变换) 

            因为我们需要的是坐标点,所以选用第一个函数。采用9点标定是因为点数越多越精确,但也不是越多越好,因为点数越多标定也会越麻烦,所选取的9个点在相机中间不要太靠近边缘,能够照顾到要定位的点即可。最少需要机械手和相机系下各2组点。

    标定步骤:

    0.准备工作:相机位置,机械手位置全部固定好,标定针固定在机械手上,固定好后不能够再移动。标定针的位置一定要与夹手或吸盘之内的工具同一位置高度。

    1.制作标定板,条件不行的,用普通的纸绘制9个圆,打印出来就行。

    2.将标定板放到相机下方,位置区域要与机械手工作的区域一样,包括高度必须尽量一致,这是标定准确度的关键。

    3.调整好相机焦距,拍照,然后识别9个点的坐标,关于如何找圆,opecv的霍夫变换找圆非常容易误判,比较好的方法是采用轮廓找圆法。这个我也想写篇博客讲一讲。

    4.将机械手依次移动到9的圆的中心,记下机械手坐标

    5.将机械手坐标destinationPoints与相机坐标sourcePoints代入方法EstimateRigidTransform,即可算出一个2*3的矩阵。

    private void CalRobot()
    {    
       Mat warpMat;
       warpMat = CvInvoke.EstimateRigidTransform(points_camera, points_robot, true);
       Image<Gray, float> img = warpMat.ToImage<Gray, float>();
       A = img.Data[0, 0, 0];
       B = img.Data[0, 1, 0];
       C = img.Data[0, 2, 0];
       D = img.Data[1, 0, 0];
       E = img.Data[1, 1, 0];
       F = img.Data[1, 2, 0];
    }

    6.根据所得到的标定参数,可将图像下的所有坐标转换为机器人的坐标,机器人即可移动到图像上指定的位置。

     坐标转换方法:

     public PointF TransformPoint(PointF pPoint)
     {
        //********************************************            
         // x = x'k*cost-y'k* sint+x0,
        // y = x'k*sint+y'k* cost+y0.
        //A = k*cost,B =-k* sint,C
        //D = k*sint,E = k* cost,F
        //********************************************* 
        PointF tPoint = new PointF();
        tPoint.X = Convert.ToSingle(A * pPoint.X + B * pPoint.Y + C);
        tPoint.Y = Convert.ToSingle(D * pPoint.X + E * pPoint.Y + F);
        return tPoint;
    }

    至此,标定结束,可以随意玩耍机械手,对着物体拍张照,定位要夹取的点,然后根据以上标定得到的参数将换算为机械手坐标系下的坐标,然后将坐标通过通信协议传送给机械手,就大功告成了!

  • 相关阅读:
    vue form dynamic validator All In one
    TypeScript api response interface All In One
    closable VS closeable All In One
    macOS 如何开启 WiFi 热点 All In One
    vue css inline style All In One
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)
    牛腩新闻 59 整合添加新闻页 FreeTextBox 富文本编辑器,检测到有潜在危险的 Request.Form 值,DropDownList 的使用
    牛腩新闻 61尾声: error.aspx的使用 防止报错
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (上)
    牛腩新闻 62:尾声续2 asp.net的编译和发布
  • 原文地址:https://www.cnblogs.com/thebreeze/p/10316030.html
Copyright © 2011-2022 走看看