机器视觉课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器视觉课程设计
对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量
学生学院机电学院
专业班级
学号
学生姓名
指导教师
2015年 1 月 20 日
目录
1 问题描述 (3)
1.1 基本目标 (3)
1.2 基本要求 (3)
2 程序及其算法 (3)
2.1 检测与计算圆半径的程序 (3)
2.2 检测与计算矩形长和宽的程序 (6)
2.2.1 打开摄像头程序 (6)
2.2.2 保存拍摄的照片程序 (7)
2.2.3 读取拍摄到的图片(读取文名字CurrentImage.jpg的图片) (7)
2.2.4 检测边上的点和计算长和高的函数 (7)
2.2.5 老师写的显示图片的函数 (11)
3 运行结果 (12)
4 小结 (13)
1 问题描述
1.1 基本目标
显示一张图片(包含一个矩形或一个圆),测量矩形的长宽或圆的直径。完成得及格分,扩展有加分!
要求图片
1.2 基本要求
“机器视觉”考试结果要求独立在计算机上完成,建议使用Visual C++和OpenCV 实现一个具有视觉捕捉、图像显示、尺寸测量等功能的对话框程序,其中必须完成对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量内容。在教师提供的基本框架程序基础上,修改、补充界面和功能。
2 程序及其算法
2.1 检测与计算圆半径的程序
思路:从图片中间横扫取点得M_Point[0],M_Point[1](x坐标相加除2的圆心的x 坐标)中间纵向取点得M_Point[2],M_Point[3](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_Point[4]={};//存放检索出的四个点 循环检索
//01纵扫
for(int Cycle_Y=1;Cycle_Y { if(e_dThreshold>q_pchDataImage[q_iWidth/2+q_iWidthStep*(Cycle_Y-1)]) { M_Point[0].x=q_iWidth/2; M_Point[0].y=Cycle_Y; } 显示图片 } for(int Cycle_Y=q_iHeight;Cycle_Y>1;Cycle_Y--) { if(e_dThreshold>q_pchDataImage[q_iWidth/2+q_iWidthStep*(Cycle_Y-1)]) { M_Point[1].x=q_iWidth/2; M_Point[1].y=Cycle_Y; } } for(int Cycle_X=1;Cycle_X { if(e_dThreshold>q_pchDataImage[Cycle_X+q_iWidthStep*(q_iHeight/2-1)]) { M_Point[2].x=Cycle_X; M_Point[2].y=q_iHeight/2; } } for(int Cycle_X=q_iWidth;Cycle_X>1;Cycle_X--) { if(e_dThreshold>q_pchDataImage[Cycle_X+q_iWidthStep*(q_iHeight/2-1)]) { M_Point[3].x=Cycle_X; M_Point[3].y=q_iHeight/2; } } for (int i=0;i<4;i++)//画边界圆 {cvCircle(m_pIplImageSource,M_Point[i],8,cvScalarAll(127),2);} int Ridius=0,clear=0; int circle_y=abs(M_Point[1].y+M_Point[0].y)/2; int circle_x=abs(M_Point[3].x+M_Point[2].x)/2; float c=0,j=0; for (int i=0;i<4;i++) { j=(M_Point[i].x-circle_x)*(M_Point[i].x-circle_x)+(M_Point[i].y-circle_y)*(M_Point[i]. y-circle_y); c=c+sqrt(j); } Ridius=c/4; //在窗口中显示长和高 char ch1[10],ch2[10]; 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::OnBnClickedButton OpenCamera() { CvCapture *q_pCvCapture=cvCreateCameraCapture(0); if(NULL==q_pCvCapture) {