




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何用摄像头来测距(opencv )标签:imageconstantsstructdistancenull图像处理2007-10-25 19:01 10455 人阅读 评论(228)收藏 举报 三分类:机器人与图像处理(5) VC + +( 9) |版权声明:本文为博主原创文章,未经博主允许不得转载。如何用摄像头来测距(opencv )作者:郭世龙最近一直忙着找工作,blog都长草了,今天把以前作的一个东西放上来充充门面吧。记得在哪看到过老外做的这个东西,觉得很好玩,就自己也做了一个。在摄像头下面固定一个激光笔,就构成了这个简易的测距装置。看一下图吧。原理假设激光束是与摄像头的光轴完全平行,激
2、光束的中心落点在在摄像头的视域中是最亮的点。激光束照射到摄像头视域中的跟踪目标上,那么摄像头可以捕捉到这个点,通过简单的图像处理的方法,可以在这侦图像中找到激光束照射形成的最亮点,同时可以计算出Y轴上方向上从落点到图像中心的象素的个数。这个落点越接近图像的中心, 被测物体距离机器人就越远。由下图图可以计算距离D :tan 8(1)等式中h是一个常量,是摄像头与激光发射器之间的垂直距离,可以直接测量获得。B可通过下式计算:0 =Num*Rop+Offset (2)其中:Num是从图像中心到落点的像素个数Rop是每个像素的弧度值Offset是弧度误差合并以上等式可以得到:D 二tan( Num *
3、+ Offset)(3)Num可以从图像上计算得到。 Rop和Offset需要通过实验计算获得。 首先测量出D的准确 值,然后根据等式(1)可以计算出准确的 0,根据等式(2)可到只含有参数 Rop和Offset 的方程。在不同的距离多次测量 D的准确值计算 0,求解方程组可以求出 Rop和Offset。这里 Rop = 0.0030354 , Offset = 0.056514344。X程序头文件:class LaserRa ngepublic:struct Ran geResult * GetRa nge(lpllmage * imgRa nge,lpllmage * imgDst);La
4、serRa nge();virtual LaserRa nge();private:un sig nedint maxW;un sig nedint maxH;un sig nedint MaxPixel;Ran geResult * strctResult;/ Values used for calculating range from captured image dataconst double gain; / Gain Con sta nt used for con vert ing pixel offset to an gle in radia nsconst double offs
5、et;/ Offset Con sta ntconst double h_cm; / Dista nee betwee n cen ter of camera and laserun sig ned int pixels_from_ce nter;/ Brightest pixel locati on from cen tervoid Preprocess(void * img,lpllmage * imgTemp);cpp文件:LaserRa nge:LaserRa nge():gai n(0.0030354),offset(0),h_cm(4.542)maxW=0;maxH=0;MaxPi
6、xel=0;pixels_from_ce nter=O;/ Brightest pixel locati on from cen terstrctResult =new Ran geResult;strctResult-maxCol=0;strctResult-maxRow=0;strctResult-maxPixel=O;strctResult-Ra nge=0.0;LaserRa nge:LaserRa nge()if(NULL!=strctResult) delete strctResult;struct Ran geResult * LaserRa nge:GetRa nge(lpll
7、mage * imgRa nge,lpllmage * imgDst)if(NULL=imgRa nge) returnstrctResult;Preprocess(imgRa nge,imgDst);pixels_from_ce nter = abs(120-maxH);/ Calculate range in cm based on bright pixel location, and setup specific constants strctResult-Ra nge= h_cm/ta n(pixels_fro m_cen ter * gai n + offset);strctResu
8、lt-PixfromCe nt=pixels_fro m_cen ter;strctResult-maxCol=maxW;strctResult-maxRow=maxH;strctResult-maxPixel=MaxPixel;strctResult-Ra nge=O.O;return strctResult;void LaserRa nge:Preprocess(void *img, Ipllmage * imgTemp)MaxPixel=0;/处理下一帧前最大像素值清零;IplImage* image = rein terpret_cast(img);cvCvtPixToPla ne(
9、image,。,0 ,imgTemp , 0);for( int j=(imgTemp-width-60)/2-1); jwidth-40)/2+59; j+)for(i nt i=5; iheight-5; i+)if(imgTemp-imageDatai*imgTemp-widthStep+j)MaxPixel)if( (imgTemp-imageData(i-1)*imgTemp-widthStep+j)MaxPixel) &(imgTemp-imageData(i-1)*imgTemp-widthStep+j+1)MaxPixel)&(imgTemp-imageData(i-1)*im
10、gTemp-widthStep+j-1)MaxPixel)if( (imgTemp-imageData(i+1)*imgTemp-widthStep+j)MaxPixel) &(imgTemp-imageData(i+1)*imgTemp-widthStep+j+1)MaxPixel)&(imgTemp-imageData(i+1)*imgTemp-widthStep+j-1)MaxPixel)if(imgTemp-imageDatai*(imgTemp-widthStep)+j+1)MaxPixel)if(imgTemp-imageDatai*(imgTemp-widthStep)+j-1)
11、MaxPixel)MaxPixel=imgTemp-imageDatai*imgTemp-widthStep+j;maxW=j;maxH=i;调用函数:int CLaserVisio nDlg:Capturelmage()/ CvCapture* capture = 0;/ capture = cvCaptureFromCAM(O);0 表示设备号if( !capture )fprin tf(stderr,Could not in itialize capturi ng./n);return -1;/ cvNamedWi ndow( LaserRa ngelmage, 1 );/ cvvNam
12、edWi ndow( image, 1);cvvNamedWi ndow( Dimage, 1);for(;)IplImage* frame = 0;if(isStop) break;frame = cvQueryFrame( capture );/从摄像头抓取一副图像框架if( !frame )break;if( !imgOrign)/allocate all the buffers创建一副图像imgOrig n = cvCreatelmage( cvGetSize(frame), 8, 3 );imgOrig n- origi n = frame-origi n;cvCopy( frame
13、, imgOrign, 0 );将图 frame 复制至U imagecvShowlmage(LaserRa ngelmage,imgOrig n);if(!imgDest)imgDest=cvCreatelmage( cvSize( imgOrig n-width,imgOrig n-height),8,1);cvZero( imgDest );struct Ran geResult * temp= laservs ion .GetRa nge(imgOrig n,imgDest);cvLine( imgOrig n, cvPoi nt(temp-maxCol,0),cvPoi nt(tem
14、p-maxCol,imgOrig n-height),cvScalar(100,100,255,0),1,8,0);cvLine( imgOrig n, cvPoi nt(0,temp-maxRow),cvPoi nt(imgOrig n-width,temp-maxRow),cvScalar(100,100,255,0),1,8,0);/ cvvShowImage( image, imgOrig n);cvSaveImage(image.bmp, imgOrig n);cvvShowImage( Dimage, imgDest);在PictureBox上显示图片CDC* pDC = GetD
15、lgltem(IDC_Picture)-GetDC();CDC dcmemory;BITMAP bm;dcmemory.CreateCompatibleDC(pDC);CBitmap* pBmp;CStri ng szFileName = image.bmp;HBITMAP hBk =(HBITMAP):Loadlmage(NULL,szFileName,IMAGE_BITMAP,0,0 ,L R_LOADFROMFILE);if(NULL!=hBk)pBmp=CBitm ap:FromHa ndle(hBk);pBmp-GetObject(sizeof(BITMAP), &bm);dcmem
16、ory.SelectObject(pBmp);pDC-BitBlt(O, 0, bm.bmWidth, bm.bmHeight, &dcmemory, 0, 0, SRCCOPY);char str80;/ To print messageCDC *pDCp= GetDC();char str280;/ Display frame coord in ates as well as calculated rangespri ntf(str, Pix Max Value=%d At x= %u, y= %u,PixfromCe nt= %d,temp-maxPixel,temp-maxCol, temp-maxRow, temp-PixfromCe nt);sprintf(str2, Range= %f cm ,temp-Rang
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国液晶显示器电源板市场调查研究报告
- 2025年中国梭织纱线市场调查研究报告
- 2025年中国木工刃具市场调查研究报告
- 2025年中国扫路刷市场调查研究报告
- 2025年中国微型电机端盖市场调查研究报告
- 2025年中国安康鱼野菜串市场调查研究报告
- 2025年中国塞普胶囊市场调查研究报告
- 2025年中国十二头田螺碟市场调查研究报告
- DB33T 1375-2024龙泉宝剑传统制作技术规范
- 城市充电桩经营合同协议
- 2025年高考历史总复习高中历史必修二八大专题知识复习提纲
- 2025事业单位考试题库及答案200题
- 新版《医疗器械经营质量管理规范》(2024)培训试题及答案
- 健合集团笔试在线测评题
- 大学生创业计划书word文档(三篇)
- LY/T 1529-2020普通胶合板生产综合能耗
- FZ/T 13056-2021涤粘混纺色纺弹力布
- 构图基础课件
- 礼仪文书写作课件
- 20CrMnTi较详细材料属性
- 99S203 消防水泵接合器安装图集
评论
0/150
提交评论