相机的像素精度,物理定位精度,亚像素定位之间的关系和进行像素的固定误差累积
2016-05-03 22:59
381 查看
用一张棋盘格来进行图像的像素精度计算,其计算程序是:
其在一张1280*1024像素的图片里,其中的棋盘格是6*9,物理尺寸为12mm*12mm如图:
其图像的计算出来的像素精度是:
物理定位精度:其是实际的位置点与计算出来的位置点的偏差,其可以转化为实际的像素位置与计算出来的像素位置的偏差,然后把这个偏差乘以像素精度既是物理定位精度。
可以得到其相机的像素精度是0.17mm/像素(其是相机在某个固定高度上时得出的,相机离目标面越远,则这个值越大,即精度降低了),其后面的几位都一直改变,是因为相机标定板也可能倾斜,或者像素长度计算误差。如果我们的像素定位精度是0.1亚像素,则其实际定位的物理精度为0.017mm,即计算的像素位置与实际的像素位置差了0.1个像素,则把其乘以0.17mm就是定位精度,所以仅仅只考虑像素精度是没有意义的(即如果你能处理到0.01的亚像素,但是你的相机像素精度是1.7mm/像素,而你的物理定位精度还是0.17mm,跟0.1亚像素的一样),其要把亚像素精度与像素的物理分辨率一起考虑,进行计算物理定位精度的计算(物理定位精度才是有实际意义的)。下面是相机的选型,就是涉及到:
(其像素精度是20/1000=0.02mm/像素,亚像素精度是0.5,则物理定位精度是0.01mm,)
如果是通过物体所占的像素多少来计算其长度时,则会出现像素的误差积累,因为我们是拿一个固定值来与像素相乘的。例如某个尺子长度在此高度的相机里拍到的图像里所占的像素为100像素,则实际的0.17mm的误差会累计,假如其误差是0.01mm,其是固定误差,即实际的是0.16mm,其固定误差就会累计成100*0.01mm=1mm的误差,现实中有些东西是不会成线性增加,是因为这些误差是随机误差,不是固定误差,随机误差积分时误差之间会进行抵消。改进方法是要使用很密的棋盘格来对应图像里的像素点,从而来提高精度,即定位物体的头跟尾的像素位置,然后把其转换到以标定纸为坐标系的物理坐标,然后进行相减则可以得出其高精度长度,不会有累计误差。
#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)\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(1000,800)); imshow("亚像素角点图", dstimg); waitKey(20); printf("检测到的0.1亚像素斜的图像角点坐标\n"); 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)\n", i, corners[i].x, corners[i].y); printf("其像素精度为:%f/像素\n", jingdux); } } waitKey(0); return 0; }
其在一张1280*1024像素的图片里,其中的棋盘格是6*9,物理尺寸为12mm*12mm如图:
其图像的计算出来的像素精度是:
物理定位精度:其是实际的位置点与计算出来的位置点的偏差,其可以转化为实际的像素位置与计算出来的像素位置的偏差,然后把这个偏差乘以像素精度既是物理定位精度。
可以得到其相机的像素精度是0.17mm/像素(其是相机在某个固定高度上时得出的,相机离目标面越远,则这个值越大,即精度降低了),其后面的几位都一直改变,是因为相机标定板也可能倾斜,或者像素长度计算误差。如果我们的像素定位精度是0.1亚像素,则其实际定位的物理精度为0.017mm,即计算的像素位置与实际的像素位置差了0.1个像素,则把其乘以0.17mm就是定位精度,所以仅仅只考虑像素精度是没有意义的(即如果你能处理到0.01的亚像素,但是你的相机像素精度是1.7mm/像素,而你的物理定位精度还是0.17mm,跟0.1亚像素的一样),其要把亚像素精度与像素的物理分辨率一起考虑,进行计算物理定位精度的计算(物理定位精度才是有实际意义的)。下面是相机的选型,就是涉及到:
(其像素精度是20/1000=0.02mm/像素,亚像素精度是0.5,则物理定位精度是0.01mm,)
如果是通过物体所占的像素多少来计算其长度时,则会出现像素的误差积累,因为我们是拿一个固定值来与像素相乘的。例如某个尺子长度在此高度的相机里拍到的图像里所占的像素为100像素,则实际的0.17mm的误差会累计,假如其误差是0.01mm,其是固定误差,即实际的是0.16mm,其固定误差就会累计成100*0.01mm=1mm的误差,现实中有些东西是不会成线性增加,是因为这些误差是随机误差,不是固定误差,随机误差积分时误差之间会进行抵消。改进方法是要使用很密的棋盘格来对应图像里的像素点,从而来提高精度,即定位物体的头跟尾的像素位置,然后把其转换到以标定纸为坐标系的物理坐标,然后进行相减则可以得出其高精度长度,不会有累计误差。
相关文章推荐
- CentOS7防火墙管理firewalld
- 分页效果
- java是怎么操作xml的-sax解析
- 高性能PHP日志系统--SeasLog学习
- C#反射Assembly 详细说明【1】
- 大数据技术之Hbase
- 大数据技术之Stome
- 55. Binary Tree Preorder Traversal
- JQuery【属性、CSS类、html、文本、值】
- python在linux中输出带颜色的文字的方法
- Co-prime(hdu4135)
- spark count统计元素个数
- 校园二手交易平台与收获友谊(IT项目管理)
- AngularJS(三)——作用域
- 中断线程
- Quartz2D的基本使用(一)
- buntu+Apache+PHP+Mysql环境搭建(完整版)
- leetcode 034 Search For A Range
- 后台线程
- 线程的礼让