zoukankan      html  css  js  c++  java
  • 棋盘格 测量 相机近似精度 (像素精度&物理精度)

    像素精度计算

    像素精度——一像素对应多少毫米——距离不同像素精度也不同

    将棋盘格与相机CCD平面大致平行摆放,通过【每个点处的近似像素精度=相邻两个角点之间的实际距离(棋盘格尺寸已知)/ 棋盘格上检出的相邻两个角点之间的像素距离】,两两角点之间计算像素精度,最后取平均

    示例:一张1280*1024像素的图片里,其中的棋盘格是6*9,物理尺寸为12mm*12mm

    #include"opencv2/opencv.hpp"
    using namespace cv;
    int main()
    {
        Mat srcimg = imread("6.bmp");
        Mat gray;
        cvtColor(srcimg,gray,CV_RGB2GRAY);
        Size board_sz = Size(6,9);
        vector<Point2f>corners;
        bool found = findChessboardCorners(srcimg, board_sz, corners,CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);
        printf("检测到的原始角点坐标");    
        for (size_t i = 0; i < corners.size(); i++)
        {
            printf("第%d个点(%f,%f)
    ",i,corners[i].x,corners[i].y);
        }
        if (found)
        {
            printf("成功检测到角点
    ");
            //检测的角点时以右下角为原点的
            cornerSubPix(gray,corners,Size(11,11),Size(-1,-1),TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));//输入的图像,必须是8位的灰度或者彩色图像。
            drawChessboardCorners(srcimg,board_sz,corners,found);    
            Mat dstimg;
            resize(srcimg,dstimg,Size(1000,800));
            imshow("亚像素角点图", dstimg);
            waitKey(20);
            printf("检测到的0.1亚像素斜的图像角点坐标
    ");
            float jingdux = 0, jinduy = 0;
            int j = 0;
            bool flag = false;
            for (size_t i = 0; i < corners.size(); i++)
         {
             if (i==0)
             {
             }
             else
             {
                 jingdux=sqrt((corners[i].x - corners[i - 1].x)*(corners[i].x - corners[i - 1].x) + (corners[i].y - corners[i - 1].y)*(corners[i].y - corners[i - 1].y));
                 jingdux = 12.0 / jingdux;
             }
             printf("第%d个点(%f,%f)
    ", i, corners[i].x, corners[i].y);
             printf("其像素精度为:%f/像素
    ", jingdux);
          }
        }
        waitKey(0);
        return 0;
    }
    
    

     

    由此可以得到其相机的像素精度是0.17mm/像素(其是相机在某个固定高度上时得出的,相机离目标面越远,则这个值越大,即精度降低了),其后面的几位都一直改变,是因为相机标定板也可能倾斜,或者像素长度计算误差。

    物理精度计算

    只考虑像素精度是没有意义的,因为很多相机可以检测亚像素

    像素精度0.17mm/像素,0.1亚像素精度,则其实际定位的物理精度为0.017mm。

    这是理想状况下的,一般还有很多外部影响导致误差增大,如果考虑外部因素的话定位精度会比理想的多几倍。

    我们的物理精度到了0.017mm,也不代表我们能检测0.017mm的物体,因为1个亚像素往往凸显不出特征

    误差处理

    如果是通过物体所占的像素多少来计算其长度时,则会出现像素的误差积累,因为我们是拿一个固定值来与像素相乘的。例如某个尺子长度在此高度的相机里拍到的图像里所占的像素为100像素,则实际的0.17mm的误差会累计,假如其误差是0.01mm,其是固定误差,即实际的是0.16mm,其固定误差就会累计成100*0.01mm=1mm的误差。

    现实中有些东西是不会成线性增加,是因为这些误差是随机误差,不是固定误差,随机误差积分时误差之间会进行抵消。改进方法是要使用很密的棋盘格来对应图像里的像素点,从而来提高精度,即定位物体的头跟尾的像素位置,然后把其转换到以标定纸为坐标系的物理坐标,然后进行相减则可以得出其高精度长度,不会有累计误差。

     
  • 相关阅读:
    animate动画回调函数
    triggerHandler不执行事件默认值
    trigger自动执行事件
    js与jquery对象的互转
    让低版本浏览器支持html5的标签
    闭包的好处罗列
    AJAX跨域
    php能干什么?
    concat() 方法用于连接两个或多个数组。
    使用 v-cloak 防止页面加载时出现 vuejs 的变量名
  • 原文地址:https://www.cnblogs.com/zealousness/p/9761907.html
Copyright © 2011-2022 走看看