指点成金-最美分享吧

登录

opencv实现双目视觉测距

admin 举报

opencv实现双目视觉测距

如果有群相关,也可以找群主。最近你一直在研究双目视觉测距数据。网上真的有很多C,但是你的个人感受不详细。对小白来说,起步尤其困难。这里我提供一个很傻的教程。用它来标记图形界面,不需要任何代码。然后用C实现测距和深度图。原则太多了。我就不提小白了。就这么做,OK。

1、准备工作

硬件准备

?-c -

一个摄像头连接,如图淘宝

软件准备

MATLAB工具箱校准工具箱

c代码

有关Vsopencv配置,请参见此博客。https://www.cnblogs.com/linshuhe/p/5764394.html已经解释得足够详细了。我们需要使用VSopencv3.1来实现实时测距

2

Matlab校准* * *

Matlab用于单目摄像机和双目摄像机的标定。这个我已经做过了。请直接参考这个博客,http://blog.csdn.net/hyacinthkiss/article/details/41317087

在您准备好上面的工具之前,我们无法正式开始

我们可以通过matlab校准获得以下数据

或者使用c进行单目和双目校准

单一目标确定

# include I ostream # include stream # include time . h # include estdio . h # include stream # include eopen v2/core/core . HPP # include eopen v2/imgproc/imgproc . HPP # include eopen v2/calib3d/calib3d . HPP # include eopen v2/high GUI/high GUI . hppusingnamespace cv;使用命名空间TD;# define calibration intmain(){ # ifdefcalibrationfsstreamin(用于校准的图像文件的right _ img.txt/*路径*/ofstream fout(用于保存校准结果的calibration _ result _ right.txt/*文件*////读取每个图像以从中提取角点,然后对角点执行亚像素精度intimage _ count0/*图像数量*/Sizeimage _ size;/*图像的大小*/Sizeboard_sizeSize(11,8);/*校准板上各行各列的角点*/vector point 2 fimage _ points _ buf;/*缓存在每个图像上检测到的角*/vector point 2 fimage _ points _ seq;/*保存所有检测到的角*/stringfilename;//图片名称vectorstringfilenameswhile(getline(fin,filename)){ image _ count;MatimageInputimread(文件名);filename . push _ back(filename);//获取图片大小if(image _ count 1){ image _ size . width imageinput . cols;image _ size . height imageinput . row;}/*提取角点*/if(0 find棋盘角点(image input,board _ size,image _ points _ buf)){//cout can find棋盘角点!

//corner cout * * filename * *找不到cannotfindchesboardcorners角!

出口(1);} else { Matview_graycvtColor(imageInput,view _ gray,CV _ RGB 2 gray);//转灰度图/*亚像素精确化*///image_points_buf初始的角点坐标向量同时作为亚像素坐标位置的输出//大小(5,5)搜索窗口大小//-1-1表示没有死区//术语标准角点的迭代过程的终止条件,可以为迭代次数和角点精度两者的组合角子ix(view _ gray,image_points_buf,Size(5,5),Size(-1,-1),terms crit(CV _ term crit _ EPSCV _ term crit _ ITER,30,0.1));image _ points _ seq。push _ back(image _ points _ buf);//保存亚像素角点/*在图像上显示角点位置*/drawschesboodcorps(view _ gray,board_size,image_points_buf,false);//用于在图片中标记角点imshow(CameraCalibration,view _ gray);//显示图片WaitKey(500);//暂停0.5S } } intCornerNumboard _ size。宽度*纸板尺寸。身高;//每张图片上总的角点数//-以下是摄像机标定- /*棋盘三维信息*/Sizesquare_sizeSize(60,60);/*实际测量得到的标定板上每个棋盘格的大小*/VectorVectorPoint 3 fo object _ points;/*保存标定板上角点的三维坐标*//*内外参数*/MatcameraMatrixMat(3,3,CV_32FC1,标量:3360 all(0));/*摄像机内参数矩阵*/矢量点数;//每幅图像中角点的数量matdistceffsmat(1,5,CV_32FC1,标量:3360 all(0));/*摄像机的5个畸变系数k1,k2,p1,p2,k3 */vectorMattvecsMat;/*每幅图像的旋转向量*/VectorAtrVecsmat;/*每幅图像的平移向量*//*初始化标定板上角点的三维坐标*/inti,j,t;for(t0;timage _ count){ vector point 3 ftemppointset;for(i0;iboard _ size . height){ for(j0;j board _ size . width j){ point 3 frel point;/*假设标定板放在世界坐标系中z0的平面上*/RealPoint。Xi *平方码。宽度;真正的重点。yj * square _ size身高;realPoint.z0temppointset。push _ back(RealPoint);} } object _ points。push _ back(tempPointSet);}/*初始化每幅图像中的角点数量假定每幅图像中都可以看到完整的标定板*/for(i0;ii图像_计数;I){ point _ counts。push _ back(电路板尺寸。宽度*纸板尺寸。身高);}/*开始标定*///对象_点世界坐标系中的角点的三维坐标//image_points_seq每一个内角点对应的图像坐标点//图像_大小图像的像素尺寸大小//cameraMatrix输出内参矩阵//distcefs输出畸变系数//rvecsMat输出旋转向量//tvecsMat输出位移向量//0标定时所采用的算法校准摄像机(对象_点,图像_点_序列,图像_大小,摄像机矩阵,距离,服务器矩阵,电视矩阵,0);//-标定完成- //-对标定结果进行评价-double total _ err 0.0;/*所有图像的平均误差的总和*/double err 0.0;/*每幅图像的平均误差*/Vector point 2 fimage _ points 2;/*保存重新计算得到的投影点*/fout每幅图像的标定误差

for(i0;ii图像_计数;I){矢量点3 ftemppointsetObject _ points[I];/*通过得到的摄像机内外参数对空间的三维点进行重新投影计算得到新的投影点*/投影点(tempPointSet,rvecsMat[i],tvecsMat[i],cameraMatrix,distCoeffs,image _ points 2);/*计算新的投影点和旧的投影点之间的误差*/Vector point 2 ftEmpimagepointimage _ points _ seq[I];MattempImagePointMatMat(1,tempImagePoint.size(),CV _ 32fc 2);马体image _ points 2 matat(1,image_points2.size(),CV _ 32 FC2);for(int j0;jtempimagepoint。size();j){image_points2Mat.atVec2f(0,j)Vec2f(image_points2[j]).x,image_points2[j].y);tempImagePointMat.atVec2f(0,j)Vec2f(tempImagePoint[j].x,tempImagePoint[j].y);}errnorm(image_points2Mat,tempImagePointMat,NORM _ L2);total _ error/point _ counts[I];fout第i1幅图像的平均误差犯罪像素endl}fout总体平均误差total_err/image_count像素endlendl//-评价完成- //-保存定标结果- Matrotation_matrixMat(3,3,CV_32FC1,标量:3360 all(0));/*保存每幅图像的旋转矩阵*/fout相机内参数矩阵endlfoutcameramatrixenddlendlfout畸变系数

他妈的粘糊糊的没完没了;对于(inti 0);S7-1200可编程控制器:(一){疯了什么事我一号-你好-你好结束;结束;fouttvecsmat[I]端;/*我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说,我是说*/Rodrigues(tvecmat[I],rotation _ matrix);他妈的什么事我一号-你好-你好结束;结束;该死的foutrotation _ matrixendl:他妈的什么事我一号-你好-你好结束;结束;他妈的无止境;{}混蛋;///-鲁仲宣是鲁仲宣-什么1740年- MatmapxMat(image_size、cv _ 32 fc 1);MatmapyMat(image_size,cv _ 32 fc 1);matrmat :眼(3,3,cv _ 32f);string imagefilename STD : stringstreamsstrtm对于(inti 0);-我!image_count:(一){ initunderstorctypymap(cameraMatrix、distcoeffs、r、cameraMatrix、image_size、CV_32FC1、mapx、mapy);matimagesourceimread(文件名[I]);matnewimageimagesource。clone():remap(imageSource、newimage、mapx、mapy、inter _ linear);strstm。clear();imagefilename . clear():str SMI 1;strsmimagefilename image filename filename _ d . jpgi write(图像文件名,新图像);}结束。close();fout。close();#else//嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨两个阿悦matsrcimread(f 3330 \ \ lane _ line _ detection \ \ left _ img \ \ 1。jpgmatdetastorrc。clone());Matcamera_matrixMat(3,3,cv _ 32 fc 1);系数扭曲://你是谁?你是谁?你是谁文件存储区(f 3330 \ \ lane _ line _ detection \ \ left _ img \ \ intringual。XML,文件存储3:读取);storage _ file[camera matrix]camera _ matrix:storage _ file[dist]系数畸变:file_storage.release()://阿积cv : un docster(src,畸变,摄像机矩阵,畸变_系数);cv 3: im show(img、src);cv : imshow(扭曲);cv 3: MW ITRI(unds侵权。jpg,畸变);cv 3: 360等待键(0);#endif//DEBUGreturn0:}

哎哎哎哎哎哎

//吴亚玲!吴亚玲# include open cv 2/core/core。HPP #包含opencv 2/img proc/img proc。HPP # include opencv 2/calib 3d/calib 3d。HPP # include open cv 2/high GUI/high GUI。HPP #包含向量#包含字符串#包含流#包含迭代器#包含stdio。h #包含stdlib。h #包含cttype。h # include open cv 2/open cv。HPP/#包括简历。h/#包括cv。h/#包括cv发电厂mesfeitscv//阿祖阿祖阿祖阿祖阿祖阿祖阿constitutionimagewidth 640 constitutionimageheight 480//阿云阿云阿云阿云阿云阿云constitt board width 11//鲁仲尼鲁仲尼组成板高度8;//-什么恒定纸板宽度*纸板高度;//阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥阿云哥constantframe框架编号8;//黄头发的人mmconstit平方尺寸60//范仲淹是范仲淹constsizaardizize(板宽、板高);尺寸最小尺寸(图像宽度、图像高度);马特、t、e、f;//R阿叔阿叔阿叔-t1790年然后呢巴蒂扬范希阳f .非政府组织哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟病媒病毒;//mattovecs检查器;//T//不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不矢量点2 fimagepointl//喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂矢量点2 fimagepointr//喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂矢量点3 fobjrealpoint//你好吗?你好吗?矢量点2 fcornerl//唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟

opencv实现双目视觉测距

相关阅读

  • 基于双目立体视觉的vi
  • 机器视觉双目实验研究开发平台整体解决方案
  • 基于双目深度估计的深度学习技术研究
  • 关于双目立体视双目视觉研究最新动态觉的三大基本算法及发展现状的总结
  • 双目视觉研究最新动态
  • 基于双目深度估计的深度学习技术研究
  • 机器视觉双目实验研究开发平台整体解决方案
  • opencv实现双目视觉测距
  • 标签: #双目视觉研究最新动态