机器视觉课程设计_第1页
机器视觉课程设计_第2页
机器视觉课程设计_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.机器视觉课程设计对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量学生学院机电学院专业班级学号学生姓名指导教师2015年1月20日.目录1问题描述.31.1基本目标 .31.2基本要求 .32程序及其算法 .32.1检测与计算圆半径的程序 .32.2检测与计算矩形长和宽的程序 .62.2.1打开摄像头程序 .62.2.2保存拍摄的照片程序 .72.2.3读取拍摄到的图片(读取文名字CurrentImage.jpg 的图片) .72.2.4检测边上的点和计算长和高的函数. 72.2.5老师写的显示图片的函数 .113运行结果.124小结 .13.1 问题描述1.1基本目标显示一张图片(包含一个矩形

2、或一个圆) ,测量矩形的长宽或圆的直径。完成得及格分,扩展有加分!要求图片1.2基本要求“机器视觉”考试结果要求独立在计算机上完成,建议使用Visual C+ 和 OpenCV实现一个具有视觉捕捉、图像显示、尺寸测量等功能的对话框程序,其中必须完成对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量内容。 在教师提供的基本框架程序基础上,修改、补充界面和功能。2 程序及其算法2.1检测与计算圆半径的程序思路 : 从图片中间横扫取点得M_Point0 ,M_Point1 (x 坐标相加除 2 的圆心的 x坐标)中间纵向取点得M_Point2 ,M_Point3 (y 坐标相加除 2 的圆心的 y 坐标

3、)圆上四个点到圆心的距离(半径)取平均值,输出为半径。.显示图片程序如下: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=

4、(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_dThreshol

5、d>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-)

6、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.

7、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_pCWndPictu

8、re=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.

9、jpg,这里事先保存了一张同名的图片,所以可以直接点击LoadImage 读取。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)c

10、vReleaseImage(&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);注:绿色的为检测是否成功打开摄像头,蓝

11、色的是读取摄像头拍摄的图片到内存,后面的语句是让图片在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: 在此添加控件通知处理程序代码

12、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检测边上的

13、点和计算长和高的函数.思路是:第一步找到边上的点, 设定一个变量 e_dThreshold 值为 127,通过循环让它与每一个像素的像素值进行比较。如果检测到一个点的像素值比127 小,则这个点可能就是需要的点(黑色 =0,白色 =255)如果每个像素都要比较运算太多,所以上边两个点的检测是沿着图片长的的2/5 分处和 3/5 分处向下检测, 下边的点是沿着 1/2 处向上检测。第二步是用找到6 个点的坐标算出三角形的面积,然后除以底边边长得到高。求三角形的面积用的是行列式的值等于三角形面积的2 倍程序如下:double c_DialogTeclarn:f_MakeRectangleWidth

14、(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_

15、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_iCycleHe

16、ight<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_iWi

17、dthStep+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_iCycleHeigh

18、t;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_iCycleWid

19、th+)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_

20、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);

21、 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_Control ShowImage (m_pIpl

22、ImageDisplay,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;/ 定义行列式doublearr9=q_CvPointLeftTop.x,q_CvPointLeftTop.y,1,q_

23、CvPointRightTop.x,q_CvPointRightTop.y,1,q_CvPo intBottom.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;/ 定义行列式DoubleARR9=q_CvPointLeft_

24、Top.x,q_CvPointLeft_Top.y,1,q_CvLeft_Bottom.x,q_CvLeft_Bottom.y,1,q_CvPointR ight_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);SetDlgItemTe

25、xt(IDC_SHORT,ch2);cvSaveImage(_T("./Result_Image.jpg"),m_pIplImageSource);.return 0;/ 调用上面的函数进行检测点和计算长和高的值,点击第四个按钮会调用这段程序,当里面的函数调用时,它会调用上面那段函数void c_DialogTeclarn:OnBnClickedButtonRectangle()/ TODO: 在此添加控件通知处理程序代码f_MakeRectangleWidth();2.2.5老师写的显示图片的函数voidc_DialogTeclarn:f_ControlShowImage

26、(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_pIplIm

27、ageShow=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; BITM

28、APINFO *e_pBITMAPINFODisplay=(BITMAPINFO *)q_piBuffer;BITMAPINFOHEADER*e_pBITMAPINFOHEADERDisplay=&(e_pBITMAPINFODisplay->bmiHeader);memset(e_pBITMAPINFOHEADERDisplay,0,sizeof(*e_pBITMAPINFOHEADERDisplay);e_pBITMAPINFOHEADERDisplay->biSize=sizeof(BITMAPINFOHEADER);e_pBITMAPINFOHEADERDispla

29、y->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_pBITMAPINFOHEADERDisp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论