摄像头距离标定方法研究(得到像素和毫米的转换比)

一般在高精度测量时需要做以下几个标定,一光学畸变标定(如果您不是用的软件镜头,一般都必须标定),二投影畸变的标定,也就是因为您安装位置误差代表的图像畸变校正,三物像空间的标定,也就是具体算出每个像素对应物空间的尺寸。

前两者应该都可以通过“张正友”标定方法进行解决;对于空间的标定,基本上都是通过获得比对现实中的已经知道长度的物体,获得像素当量到长度的转化。

现实拍摄的物体,或多或少会有噪音干扰,在标定的过程中还需要图像处理算法进行纠正。

比如我获得这样的图片。这幅图片的获取,基于我自己改造的图像处理支架,对于普通的实验来说,已经比较纯净了。由于使用的是钢尺,反光比较厉害。为了便于标定,我将10厘米和20厘米两个地方用绿色胶带缠绕住。

下一步,就是要获得关键区域。通过GOPre的分析,原始图像在YUV域下,比较方便分割

编写代码分割,阈值分析

Mat src = imread("E:\\sandbox\\1.bmp");

Mat dst;

Mat tmp;

vector<Mat> matSplit;

cvtColor(src,tmp,COLOR_BGR2YUV);

split(tmp,matSplit);

dst = matSplit[1];

threshold(dst,dst,100,255,

COLOR_BGR2Lab)  );

cv::waitKey();

这个时候还是有噪音的,但是已经比较理想了。最合适的方法就是投影分析。由于GOCVHelper中的投影分析本来是对字符投影进行分割的,所以需要适当地修正。

void projection4ruler(Mat src, int& down1,int& up2 ,int direction){

Mat tmp = src.clone();

vector<int> vdate;

if (DIRECTION_X == direction){

for (int i=0;i<tmp.cols;i++){

Mat data = tmp.col(i);

int itmp = countNonZero(data);

if (itmp > 10)

{

int jjj=0;

}

vdate.push_back(itmp);

}

}else{

for (int i=0;i<tmp.rows;i++){

Mat data = tmp.row(i);

int itmp = countNonZero(data);

vdate.push_back(itmp);

}

}

//过滤掉所有噪音

//寻找第一个下边沿和第二个上边沿

down1 = 1;

up2   = src.cols - 1;

for (int i=0;i<tmp.cols-1;i++)

{

if (vdate[i] >=  100 && vdate[i+1] < 100)

{

down1 = i;

break;

}

}

for (int i= down1;i<tmp.cols - 1;i++)

{

if (vdate[i] < 100 && vdate[i+1] >= 100)

{

up2 = i;

return;

}

}

}

寻找并且标注出来,非常准确。

图上(1767 - 771  =  996)对于10厘米,那么,那么1个像素相当于0.1毫米(这个整数只是巧合)

多次测量,验证算法的稳定性,并运用于实际项目。

小结

基于算法库和成熟的思路,能够加速解决问题速度。

比较好的视觉环境也很重要。

附全部代码

//GoCvHelper的demo程序

#include "stdafx.h"

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "GoCvHelper.h"

using namespace std;

using namespace cv;

using namespace GO;

#define  VP  vector<cv::Point>  //用VP符号代替 vector<point>

void projection4ruler(Mat src, int& down1,int& up2 ,int direction){

Mat tmp = src.clone();

vector<int> vdate;

if (DIRECTION_X == direction){

for (int i=0;i<tmp.cols;i++){

Mat data = tmp.col(i);

int itmp = countNonZero(data);

if (itmp > 10)

{

int jjj=0;

}

vdate.push_back(itmp);

}

}else{

for (int i=0;i<tmp.rows;i++){

Mat data = tmp.row(i);

int itmp = countNonZero(data);

vdate.push_back(itmp);

}

}

//过滤掉所有噪音

//寻找第一个下边沿和第二个上边沿

down1 = 1;

up2   = src.cols - 1;

for (int i=0;i<tmp.cols-1;i++)

{

if (vdate[i] >=  100 && vdate[i+1] < 100)

{

down1 = i;

break;

}

}

for (int i= down1;i<tmp.cols - 1;i++)

{

if (vdate[i] < 100 && vdate[i+1] >= 100)

{

up2 = i;

return;

}

}

}

int _tmain(int argc, _TCHAR* argv[])

{

Mat src = imread("E:\\sandbox\\1.bmp");

Mat dst;

Mat tmp;

int up1 = 0;

int down2 = 0;

vector<Mat> matSplit;

cvtColor(src,tmp,COLOR_BGR2Lab);

split(tmp,matSplit);

dst = matSplit[1];

threshold(dst,dst,100,255,THRESH_OTSU);

threshold(dst,dst,0,255,THRESH_BINARY_INV);//以白色为有数据

projection4ruler(dst,up1,down2,DIRECTION_X);

line(src,Point(up1,0),Point(up1,src.rows-1),Scalar(0,0,255),1);

line(src,Point(down2,0),Point(down2,src.rows-1),Scalar(0,0,255),1);

cv::waitKey();

return 0;

}

来自为知笔记(Wiz)

附件列表

时间: 2024-08-24 19:58:21

摄像头距离标定方法研究(得到像素和毫米的转换比)的相关文章

基于三维GIS技术的矢量地图动态LOD渲染方法研究现状

“地图是人类文化的杰作,它融科学.艺术于一体,作为描述.研究人类生存环境的一种信息载体是人类生产与生活中不可缺少的一种工具.”这是陈述彭院士为<中国地图学年鉴>作序的开场语.Taylor也曾指出“当涉及应用人脑来识别空间联系中的模式与相互关系时,地图学的认知方法是唯一的过程”.地图存在于我们生活的方方面面,应用广泛且己经产生了巨大的社会效应和经济效益,其重要性不言而喻.地图是地图可视化的结果,地图可视化作为现代地图学的核心一直是三维GIS的研究热点.地图可视化将电子设备的视觉传输能力和人类的视

对摄像头进行标定

转自 http://wiki.opencv.org.cn/index.php/%E6%91%84%E5%83%8F%E5%A4%B4%E6%A0%87%E5%AE%9A 摄像头标定 目录 [隐藏] 1 标定原理介绍 2 标定程序1(opencv自带的示例程序) 2.1 简介 2.2 使用说明 2.3 调用命令行和参数介绍 2.4 list_of_views.txt 2.5 输入为摄像机或者avi文件时 2.6 代码 3 标定程序2 3.1 代码 [编辑] 标定原理介绍 摄像机小孔模型 Cv照相机

Android应用程序通用自动脱壳方法研究

Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从一开始只有甲方公司提供服务到现在大型互联网公司都有自己的加固保护服务,同时与金钱相

php计算两个坐标(经度,纬度)之间距离的方法

本文实例讲述了php计算两个坐标(经度,纬度)之间距离的方法.分享给大家供大家参考.具体如下: 这里使用php计算两个坐标(经度,纬度)之间的距离,返回结果为米或者千米 function distance($lat1, $lng1, $lat2, $lng2, $miles = true) {  $pi80 = M_PI / 180;  $lat1 *= $pi80;  $lng1 *= $pi80;  $lat2 *= $pi80;  $lng2 *= $pi80;  $r = 6372.79

用VBA取得EXCEL有效行列数方法研究

作者:iamlaosong 我常用下面方式取得有效行数: maxrow=sheets(1).[A65536].End(xlUp).Row 实际使用中发现这种方法存在2个问题: 1.高低版本不兼容,2007版最大行数增加以后,就不能用65536了,而要用1048576,即 maxrow = sheets(1).[A1048576].End(xlUp).Row 2.当最后一行不为空时,用这个方法取不到正确的值. 下面说明用VBA得到EXCEL表格中的行数和列数的特点,以便根据需要选用 每种方法中上面

[转载]Android应用程序通用自动脱壳方法研究

本文转载自: http://drops.wooyun.org/tips/9214 Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从

基于随机森林的煤与瓦斯突出预测方法研究

1引言 煤炭在我国一次能源中的主导地位短期内不会发生根本性改变.随着煤炭产量的增长,近年来我国煤矿生产事故频繁发生,安全形势非常严峻.煤矿事故已经成为社会各界关注的焦点.而煤与瓦斯突出是煤矿生产过程中的一种严重自然灾害.长期以来,煤与瓦斯突出事故严重制约着我国煤矿生产和煤炭企业经济效益的提高,给煤矿安全生产和井下作业人员的生命财产安全带来了极大威胁.因此,正确预测矿井煤与瓦斯突出的规模,对于煤炭企业安全生产具有重要的现实意义. 目前关于煤与瓦斯突出的预测方法主要有:单项指标法.瓦斯地质统计法.D

【转】通过经纬度坐标计算距离的方法(经纬度距离计算)

最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double Rc = 6378137;  // 赤道半径 static double Rj = 6356725;  // 极半径 class JWD { public: double m_Longitude, m_Latitude; double m_RadLo, m_RadLa; double Ec; double Ed; public: JWD(doub

2015.03.10,学习,论文学习笔记-“水轮机压力脉动的混频幅值置信度分析方法研究”

文献:胡江艺.水轮机压力脉动的混频幅值置信度分析方法研究.水利机械技术,2014(3).17-22 摘要:文章根据IEC试验规程要求,对常见的用于计算压力脉动混频幅值置信度方法进行了分析.结合模型试验结果对压力脉动随机变量的分布进行了讨论.分析了计算方法的实用性,提出了符合要求的计算方法. 关键词:压力脉动 混频幅值 置信度 正态分布 笔记: 国内压力脉动测量采用混频压力脉动相对幅值,即时域内压力脉动的峰峰值与净水头H的幅值,其中峰峰值采用了置信度方法计算.IEC规程定义的混频压力脉动幅值称为宽