欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    机器视觉矩形与圆检测(共12页).doc

    • 资源ID:14432261       资源大小:421.50KB        全文页数:12页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    机器视觉矩形与圆检测(共12页).doc

    精选优质文档-倾情为你奉上机器视觉课程设计 学 院 机电工程学院 专 业 机械设计制造及其自动化 (微电子制造专业方向) 年级班别 XXXXXXXXXXXXXXXX 学 号 XXXXXXXXXXXXX 学生姓名 XXXXXXXXX 指导教师 XXXXXXXXX 2015年1月18日专心-专注-专业1 问题描述1.1 基本目标 显示一张图片(包含一个矩形或一个圆),测量矩形的长宽或圆的直径。完成得及格分,扩展有加分!要求图片1.2 基本要求 “机器视觉”考试结果要求独立在计算机上完成,建议使用Visual C+和OpenCV实现一个具有视觉捕捉、图像显示、尺寸测量等功能的对话框程序,其中必须完成对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量内容。在教师提供的基本框架程序基础上,修改、补充界面和功能。2 程序及其算法2.1 检测与计算圆半径的程序 思路:从图片中间横扫取点得M_Point0,M_Point1(x坐标相加除2的圆心的x坐标)中间纵向取点得M_Point2,M_Point3(y坐标相加除2的圆心的y坐标)圆上四个点到圆心的距离(半径)取平均值,输出为半径。显示图片程序如下:double c_DialogTeclarn:f_MakeCircle(double e_dThreshold)if(NULL=m_pIplImageSource)return 0;/定义变量存图像的宽,高,行像素int q_iWidth=m_pIplImageSource->width;int q_iHeight=m_pIplImageSource->height;int q_iWidthStep=m_pIplImageSource->widthStep;uchar *q_pchDataImage=(uchar *)m_pIplImageSource->imageData;CvPoint M_Point4=;/存放检索出的四个点 循环检索/01纵扫for(int Cycle_Y=1;Cycle_Y<q_iHeight;Cycle_Y+)if(e_dThreshold>q_pchDataImageq_iWidth/2+q_iWidthStep*(Cycle_Y-1)M_Point0.x=q_iWidth/2;M_Point0.y=Cycle_Y;for(int Cycle_Y=q_iHeight;Cycle_Y>1;Cycle_Y-)if(e_dThreshold>q_pchDataImageq_iWidth/2+q_iWidthStep*(Cycle_Y-1)M_Point1.x=q_iWidth/2;M_Point1.y=Cycle_Y;for(int Cycle_X=1;Cycle_X<q_iWidth;Cycle_X+)if(e_dThreshold>q_pchDataImageCycle_X+q_iWidthStep*(q_iHeight/2-1)M_Point2.x=Cycle_X;M_Point2.y=q_iHeight/2;for(int Cycle_X=q_iWidth;Cycle_X>1;Cycle_X-)if(e_dThreshold>q_pchDataImageCycle_X+q_iWidthStep*(q_iHeight/2-1)M_Point3.x=Cycle_X;M_Point3.y=q_iHeight/2;for (int i=0;i<4;i+)/画边界圆cvCircle(m_pIplImageSource,M_Pointi,8,cvScalarAll(127),2);int Ridius=0,clear=0;int circle_y=abs(M_Point1.y+M_Point0.y)/2;int circle_x=abs(M_Point3.x+M_Point2.x)/2;float c=0,j=0;for (int i=0;i<4;i+)j=(M_Pointi.x-circle_x)*(M_Pointi.x-circle_x)+(M_Pointi.y-circle_y)*(M_Pointi.y-circle_y);c=c+sqrt(j);Ridius=c/4;/在窗口中显示长和高char ch110,ch210;itoa(Ridius,ch1,10);itoa(clear,ch2,10);SetDlgItemText(IDC_LONG,ch1);SetDlgItemText(IDC_SHORT,ch2);CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY);f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);cvSaveImage(_T("./Result_Image.jpg"),m_pIplImageSource);return 0;2.2 检测与计算矩形长和宽的程序 思路:这个程序主要包括:打开摄像头-保存图片(拍照)-加载刚刚保存的图片-找出点并计算长和高 四个按钮,每一个按钮包含下面的一段代码,拍摄的图片保存为CurrentImage.jpg,这里事先保存了一张同名的图片,所以可以直接点击Load Image读取。 2.2.1 打开摄像头程序void c_DialogTeclarn:OnBnClickedButtonOpenCamera() CvCapture *q_pCvCapture=cvCreateCameraCapture(0); if(NULL=q_pCvCapture) return; IplImage *q_pIplImageCapture=cvQueryFrame(q_pCvCapture); if(NULL=q_pIplImageCapture) return; if(NULL!=m_pIplImageSource) cvReleaseImage(&m_pIplImageSource); m_pIplImageSource=NULL; m_pIplImageSource=cvCloneImage(q_pIplImageCapture); cvReleaseCapture(&q_pCvCapture); CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY); f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);注:绿色的为检测是否成功打开摄像头,蓝色的是读取摄像头拍摄的图片到内存,后面的语句是让图片在mfc窗口显示出来。 2.2.2 保存拍摄的照片程序void c_DialogTeclarn:OnBnClickedButtonSaveImage() / TODO: 在此添加控件通知处理程序代码 cvSaveImage(_T("./CurrentImage.jpg"),m_pIplImageSource); 2.2.3 读取拍摄到的图片(读取文名字CurrentImage.jpg的图片)void c_DialogTeclarn:OnBnClickedButtonLoadImage()/ TODO: 在此添加控件通知处理程序代码if(NULL!=m_pIplImageSource)cvReleaseImage(&m_pIplImageSource);m_pIplImageSource=NULL;m_pIplImageSource=cvLoadImage(_T("./CurrentImage.jpg"),0);CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY);f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource); 2.2.4 检测边上的点和计算长和高的函数思路是:第一步找到边上的点,设定一个变量e_dThreshold值为127,通过循环让它与每一个像素的像素值进行比较。如果检测到一个点的像素值比127小,则这个点可能就是需要的点(黑色=0,白色=255)如果每个像素都要比较运算太多,所以上边两个点的检测是沿着图片长的的2/5分处和3/5分处向下检测,下边的点是沿着1/2处向上检测。第二步是用找到6个点的坐标算出三角形的面积,然后除以底边边长得到高。求三角形的面积用的是行列式 的值等于三角形面积的2倍程序如下:double c_DialogTeclarn:f_MakeRectangleWidth(double e_dThreshold) / TODO: 在此添加控件通知处理程序代码/定义一些点和变量 int q_iWidth=m_pIplImageSource->width; int q_iHeight=m_pIplImageSource->height; int q_iWidthStep=m_pIplImageSource->widthStep; uchar *q_pchDataImage=(uchar *)m_pIplImageSource->imageData; int q_iXLeftTop=2*q_iWidth/5; int q_iXRightTop=3*q_iWidth/5; int q_iXBottom=q_iWidth/2; int q_iYLeftTop=2*q_iHeight/5; int q_iYLeftBottom=3*q_iHeight/5; int q_iYRightMid=q_iHeight/2; CvPoint q_CvPointLeftTop,q_CvPointRightTop,q_CvPointBottom; CvPoint q_CvPointLeft_Top,q_CvPointRight_Mid,q_CvLeft_Bottom; /求上下两边上的点,3个循环 for(int q_iCycleHeight=0;q_iCycleHeight<q_iHeight;q_iCycleHeight+) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidthStep+q_iXLeftTop) q_CvPointLeftTop.x=q_iXLeftTop; q_CvPointLeftTop.y=q_iCycleHeight; break; for(int q_iCycleHeight=0;q_iCycleHeight<q_iHeight;q_iCycleHeight+) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidthStep+q_iXRightTop) q_CvPointRightTop.x=q_iXRightTop; q_CvPointRightTop.y=q_iCycleHeight; break; for(int q_iCycleHeight=q_iHeight-1;q_iCycleHeight>=0;q_iCycleHeight-) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidthStep+q_iXBottom) q_CvPointBottom.x=q_iXBottom; q_CvPointBottom.y=q_iCycleHeight; break; /求左右两边上的点,3个循环 for(int q_iCycleWidth=0;q_iCycleWidth<q_iHeight;q_iCycleWidth+) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_iYLeftTop-1) q_CvPointLeft_Top.x=q_iCycleWidth; q_CvPointLeft_Top.y=q_iYLeftTop; break; for(int q_iCycleWidth=0;q_iCycleWidth<q_iHeight;q_iCycleWidth+) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_iYLeftBottom-1) q_CvLeft_Bottom.x=q_iCycleWidth; q_CvLeft_Bottom.y=q_iYLeftBottom; break; for(int q_iCycleWidth=q_iHeight-1;q_iCycleWidth>=0;q_iCycleWidth-) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_iYRightMid-1) q_CvPointRight_Mid.x=q_iCycleWidth; q_CvPointRight_Mid.y=q_iYRightMid; break; /在检测到的点上画圆,只是为了更好看到找点的情况 cvCircle(m_pIplImageSource,q_CvPointLeftTop,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointRightTop,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointBottom,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointLeft_Top,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvLeft_Bottom,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointRight_Mid,5,cvScalarAll(127),2);/显示画圆后的图片 CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY); f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);/计算长和高的像素值,三角形3点的坐标构成行列式,行列式的值=2*面积,行列式的值/底边=高CvMat Ma;int HIGH,WIDE;float Area;int a=q_CvPointLeftTop.x-q_CvPointRightTop.x;int b=q_CvPointLeftTop.y-q_CvPointRightTop.y;double c=a*a+b*b;/定义行列式double arr9=q_CvPointLeftTop.x,q_CvPointLeftTop.y,1,q_CvPointRightTop.x,q_CvPointRightTop.y,1,q_CvPointBottom.x,q_CvPointBottom.y,1;cvInitMatHeader(&Ma,3,3,CV_64FC1,arr);Area=abs(cvDet(&Ma);HIGH=Area/sqrt(c);int A=q_CvPointLeft_Top.x-q_CvLeft_Bottom.x;int B=q_CvPointLeft_Top.y-q_CvLeft_Bottom.y;double C=A*A+B*B;/定义行列式Double ARR9=q_CvPointLeft_Top.x,q_CvPointLeft_Top.y,1,q_CvLeft_Bottom.x,q_CvLeft_Bottom.y,1,q_CvPointRight_Mid.x,q_CvPointRight_Mid.y,1;cvInitMatHeader(&Ma,3,3,CV_64FC1,ARR);Area=abs(cvDet(&Ma);WIDE=Area/sqrt(C);/在窗口中显示长和高 char ch110,ch210; itoa(HIGH,ch1,10); itoa(WIDE,ch2,10); SetDlgItemText(IDC_LONG,ch1); SetDlgItemText(IDC_SHORT,ch2); cvSaveImage(_T("./Result_Image.jpg"),m_pIplImageSource); return 0;/调用上面的函数进行检测点和计算长和高的值,点击第四个按钮会调用这段程序,当里面的函数调用时,它会调用上面那段函数void c_DialogTeclarn:OnBnClickedButtonRectangle() / TODO: 在此添加控件通知处理程序代码 f_MakeRectangleWidth(); 2.2.5 老师写的显示图片的函数void c_DialogTeclarn:f_ControlShowImage(IplImage *&e_pIplImageShow,CWnd *e_pCWndControl, IplImage *e_pIplImageSource) if(NULL=e_pCWndControl)|(NULL=e_pIplImageSource) return; CRect q_CRectControl; e_pCWndControl->GetClientRect(&q_CRectControl); if(NULL!=e_pIplImageShow) cvReleaseImage(&e_pIplImageShow); e_pIplImageShow=NULL; e_pIplImageShow=cvCreateImage(cvSize(q_CRectControl.Width(),q_CRectControl.Height(), IPL_DEPTH_8U, e_pIplImageSource->nChannels); cvResize(e_pIplImageSource,e_pIplImageShow); HDC q_HDCControl=e_pCWndControl->GetDC()->GetSafeHdc(); unsigned int q_piBuffersizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256; BITMAPINFO *e_pBITMAPINFODisplay=(BITMAPINFO *)q_piBuffer; BITMAPINFOHEADER *e_pBITMAPINFOHEADERDisplay=&(e_pBITMAPINFODisplay->bmiHeader); memset(e_pBITMAPINFOHEADERDisplay,0,sizeof(*e_pBITMAPINFOHEADERDisplay); e_pBITMAPINFOHEADERDisplay->biSize=sizeof(BITMAPINFOHEADER); e_pBITMAPINFOHEADERDisplay->biWidth=e_pIplImageShow->width; e_pBITMAPINFOHEADERDisplay->biHeight=-e_pIplImageShow->height; e_pBITMAPINFOHEADERDisplay->biPlanes=1; e_pBITMAPINFOHEADERDisplay->biBitCount=8*e_pIplImageShow->nChannels; e_pBITMAPINFOHEADERDisplay->biCompression=BI_RGB; RGBQUAD* palette=e_pBITMAPINFODisplay->bmiColors; if(8=e_pBITMAPINFOHEADERDisplay->biBitCount) for(int q_iCycle=0;q_iCycle<256;q_iCycle+) paletteq_iCycle.rgbBlue=(BYTE)q_iCycle; paletteq_iCycle.rgbGreen=(BYTE)q_iCycle; paletteq_iCycle.rgbRed=(BYTE)q_iCycle; paletteq_iCycle.rgbReserved=(BYTE)0; StretchDIBits(q_HDCControl, q_CRectControl.left, q_CRectControl.top, e_pIplImageShow->width, e_pIplImageShow->height, q_CRectControl.left, q_CRectControl.top, e_pIplImageShow->width, e_pIplImageShow->height, e_pIplImageShow->imageData, e_pBITMAPINFODisplay, DIB_RGB_COLORS, SRCCOPY);3 运行结果 运行结果图形如下:检测图片-矩形拍摄图片-矩形4 小结呵呵

    注意事项

    本文(机器视觉矩形与圆检测(共12页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开