像素精度计算

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

将棋盘格与相机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(,);
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 = ; i < corners.size(); i++)
{
printf("第%d个点(%f,%f)\n",i,corners[i].x,corners[i].y);
}
if (found)
{
printf("成功检测到角点\n");
//检测的角点时以右下角为原点的
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(,));
imshow("亚像素角点图", dstimg);
waitKey();
printf("检测到的0.1亚像素斜的图像角点坐标\n");
float jingdux = , jinduy = ;
int j = ;
bool flag = false;
for (size_t i = ; i < corners.size(); i++)
{
if (i==)
{
}
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)\n", i, corners[i].x, corners[i].y);
printf("其像素精度为:%f/像素\n", jingdux);
}
}
waitKey();
return ;
}

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

物理精度计算

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

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

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

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

误差处理

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

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

棋盘格 测量 相机近似精度 (像素精度&物理精度)的更多相关文章

  1. CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport

    1.PX(CSS pixels) 1.1 定义 虚拟像素,可以理解为“直觉”像素,CSS和JS使用的抽象单位,浏览器内的一切长度都是以CSS像素为单位的,CSS像素的单位是px. 1.2 注意 在CS ...

  2. pixel像素与物理像素

  3. 移动端适配(绝对单位、相对单位、CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport)

    在某公司做了一次分享,主题是‘移动端和pc端开发的区别’.可以说,这总结的原版就是在这样的契机下完成的.因为我只是习惯了移动端就应该那么写(设置viewport等),要是让我给大家分条讲下所以然,还真 ...

  4. pt和px区别 pt是逻辑像素,px是物理像素

    pt和px区别 pt是逻辑像素,px是物理像素字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢?先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点:pt就是po ...

  5. D3D9 浮点精度的问题

    最近在对我们的渲染引擎进行优化的时候,发现一个奇怪的现象,因为我们做了Pre-Z(把比较大的物体先绘制一遍,这个时候关闭颜色写,只开启深度测试和写入,目的是为了减少后面一些不可见像素的计算.),面在绘 ...

  6. ACCESS-关于DELPHI中操作ACCESS数据库中单精度数据的问题

    在近日几个帖子里面,和QQ群的讨论里面,我发现很多网友都遇到的问题都是因为不恰当地使用了单精度/双精度数值.因此想专门就这个话题谈一下. 单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面) ...

  7. 支持无限精度无限大数的类BigNumber实现

    介绍 本篇是MathAssist的第二篇,在前言中粗略地展示了MathAssist的“计算和证明”能力,本篇开始将详细介绍其实现原理. 从计算开始说起,要实现任意大数的计算器首先得有一个类支持大数运算 ...

  8. php浮点型以及精度问题

    浮点型(也叫浮点数 float,双精度数 double 或实数 real) 浮点数的形式表示: LNUM [0-9]+DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9 ...

  9. 设置浮点数的显示精度&precision(0)

    /*    设置浮点数的显示精度    cout.precision(int)可以设置浮点数的显示精度(不包括小数点)        注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...

随机推荐

  1. dp之多重背包hdu1059

    题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...

  2. 基于jquery垂直缩略图切换相册

    今天给大家分享一款垂直缩略图切换jQuery相册,这是一款垂直缩略图左右滚动切换响应式jQuery图片相册代码.该 插件适用浏览器:IE8.360.FireFox.Chrome.Safari.Oper ...

  3. 软件配置管理中的SVN

    一.简单介绍 1.什么是软件配置管理 软件配置管理是指通过运行版本号控制.变更控制的规程.以及使用合适的配置管理软件.来保证全部配置项的完整性和可跟踪性. 配置管理是对工作成果的一种有效保护. 2.为 ...

  4. Unix系统编程()改变信号处置:signal

    Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...

  5. RP2837 OUT1-OUT2 对应关系 2路DO

    RP2837 OUT1-OUT2 对应关系: OUT1  AD2   PD22  继电器1 OUT2  AD4   PD24     继电器2 root@sama5d3-linux:~ echo 11 ...

  6. wrk -- 小巧轻盈的 http 性能测试工具.

    标签: wrk http 性能 | 发表时间:2015-06-21 00:55 | 作者:zjumty 出处:http://www.iteye.com 测试先行是软件系统质量保证的有效手段. 在单元测 ...

  7. git 删除分之以及删除文件夹

    1.删除分支 1.1查看所有分支: git branch -a 得到结果: 1.2删除HEAD分支 git push origin --delete HEAD 2.删除文件夹 2.1 查看本地分支下的 ...

  8. MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用

    学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...

  9. 函数 free 的原型

    函数 free 的原型如下: void free( void * memblock ); 为什么 free 函数不象 malloc 函数那样复杂呢? 这是因为指针 p 的类型以及它所指 的内存的容量事 ...

  10. ORACLE之常用FAQ V1.0

    [B]第一部分.SQL&PL/SQL[/B][Q]怎么样查询特殊字符,如通配符%与_[A]select * from table where name like 'A\_%' escape ' ...