Opencv视觉学习--单目测距

对于刚开始学习Opencv的朋友们,查找资料是自学最好的方式。
这一篇博客,我将介绍Opencv单目测距的操作,如有问题或建议可留言于我,谢谢!
更多资料请点击:我的目录

单目测距需要用到四个参数: 被测物的实际宽度W(实际测量)
被测物的像素宽值P  (相机输出)
被测物与相机距离D
相机焦距               F 

两个公式: 求焦距: F = ( P * D ) / W
求实距: D = ( W * F ) / P

操作步骤:
① 求出相机的准确焦:根据几组自定义数据,测出被测物的实际宽度W,设定适当的被测物与相机距离D,算出准确的焦距,再给镜头焦距定值。
②精确装甲板两矩形中点实际距离:先用尺子量出最准确的长度进行初调,在给镜头焦距定值后,通过预测距离D的测量值与实际值对比,给定最合适的实际距离。
③实现单目测距:通过步骤①②,已有较精确的W、F,此时就能直接运用求实距的公式实现测距。若输出结果与实际误差较大,那就需要重新①②步骤了。

源码:

float distanceCamera(const RotatedRect r1, const RotatedRect r2)
{
    float x1 = r1.center.x;
    float y1 = r1.center.y;
    float x2 = r2.center.x;
    float y2 = r2.center.y;
    float rectans_distance = sqrt(pow(x1-x2,2)+pow(y1-y2,2));     //俩轮廓中心距
    unsigned int half_girth = r1.size.width+r1.size.height;           //二分之一周长
    unsigned int  Actual_length;
    float aspect_ratio = rectans_distance / half_girth;
    if(aspect_ratio  >3.6550)
    {
        Actual_length =2300 ;   //大 两轮廓中心点实际距离 mm
    }
    else
    {
         Actual_length =1350;   //小 两轮廓中心点实际距离 mm
    }
//         float  focal_length  = 7.00;   //普通相机焦距 mm
         float  focal_length  = 10.3;   //工业相机焦距 mm
         float  Distance_to_camera = ( Actual_length * focal_length )/rectans_distance;   //装甲板到相机的距离 cm
         return Distance_to_camera;
  //       return aspect_ratio;
}

更多资料请点击:我的目录

你可能感兴趣的:(Opencv视觉学习--单目测距)