机器视觉课程设计报告书

合集下载

机器视觉系列课程设计

机器视觉系列课程设计

机器视觉系列课程设计一、教学目标本课程旨在通过机器视觉系列课程的学习,让学生掌握机器视觉的基本概念、原理和应用。

具体目标如下:1.了解机器视觉的基本概念和原理。

2.掌握机器视觉的主要技术和应用领域。

3.熟悉机器视觉的基本算法和编程方法。

4.能够运用机器视觉技术解决实际问题。

5.具备进行机器视觉算法设计和编程的能力。

6.能够进行机器视觉系统的设计和调试。

情感态度价值观目标:1.培养学生对机器视觉技术的兴趣和热情。

2.培养学生对科技创新和智能化发展的认识和关注。

3.培养学生具备团队合作和创新思维的能力。

二、教学内容本课程的教学内容主要包括机器视觉的基本概念、原理、技术和应用。

具体安排如下:第1周:机器视觉概述1.1 机器视觉的基本概念1.2 机器视觉的发展历程1.3 机器视觉的应用领域第2周:机器视觉的基本原理2.1 图像处理基础2.2 特征提取和匹配2.3 机器视觉的算法概述第3周:机器视觉的主要技术3.1 计算机视觉3.2 图像识别与分类3.3 目标检测和跟踪第4周:机器视觉的应用案例4.1 工业自动化4.2 智能交通4.3 医疗影像分析三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。

1.讲授法:通过教师的讲解,让学生掌握机器视觉的基本概念、原理和算法。

2.讨论法:通过分组讨论,培养学生的团队合作能力和创新思维。

3.案例分析法:通过分析实际应用案例,让学生了解机器视觉技术的应用领域和解决方案。

4.实验法:通过实验室实践,让学生动手操作和调试机器视觉系统,培养学生的实际操作能力。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选用《机器视觉》一书作为主要教材,系统介绍机器视觉的基本概念、原理和应用。

2.参考书:提供相关的参考书籍,供学生深入学习和拓展知识。

3.多媒体资料:制作精美的PPT和教学视频,帮助学生更好地理解和掌握机器视觉技术。

机器视觉课课程设计

机器视觉课课程设计

机器视觉课课程设计一、教学目标本课程旨在让学生了解和掌握机器视觉的基本概念、原理和应用,培养学生对机器视觉技术的兴趣和好奇心,提高学生的科学素养和创新能力。

具体目标如下:1.知识目标:学生能够理解机器视觉的基本原理,掌握常见的机器视觉技术和应用,如图像处理、目标检测、人脸识别等。

2.技能目标:学生能够运用机器视觉技术解决实际问题,如编写简单的机器视觉程序,进行图像处理和目标检测等。

3.情感态度价值观目标:学生能够认识到机器视觉技术在现代社会中的重要性,理解科技对人类生活的影响,培养正确的科技观念和价值观。

二、教学内容本课程的教学内容主要包括机器视觉的基本概念、原理和应用。

具体安排如下:1.第一章:机器视觉概述,介绍机器视觉的定义、发展历程和应用领域。

2.第二章:图像处理,讲解图像处理的基本概念、原理和常用方法,如图像滤波、边缘检测、图像分割等。

3.第三章:目标检测,介绍目标检测的基本方法和技术,如滑动窗口法、特征匹配、深度学习等。

4.第四章:人脸识别,讲解人脸识别的基本原理和常用算法,如特征提取、模板匹配、神经网络等。

5.第五章:机器视觉应用,介绍机器视觉在现实生活中的应用案例,如自动驾驶、无人机、工业自动化等。

三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。

具体方法如下:1.讲授法:教师讲解机器视觉的基本概念、原理和算法,引导学生理解并掌握相关知识。

2.讨论法:学生分组讨论实际案例,分析机器视觉技术在解决问题中的应用,培养学生的思维能力和团队协作精神。

3.案例分析法:分析具体的机器视觉应用案例,让学生了解机器视觉技术在现实生活中的重要性。

4.实验法:学生动手编写机器视觉程序,进行图像处理和目标检测等实验,提高学生的实际操作能力。

四、教学资源本课程所需的教学资源包括教材、参考书、多媒体资料和实验设备。

具体如下:1.教材:选用《机器视觉》一书作为主要教材,为学生提供系统的机器视觉知识。

机器视觉实验报告

机器视觉实验报告

研究生课程论文机器视觉应用实验报告《机器视觉应用实验报告》姓名学号院系专业仪器仪表工程指导教师华南理工大学实验报告课程名称:机器视觉应用机械与汽车工程学院系仪器仪表工程专业姓名廖帆实验名称机器视觉应用实验日期指导老师一、实验目的自行搭建机器视觉测量系统,采集标定板、工件图像,利用图像处理软件进行标定、工件尺寸测量、工件缺陷检测。

主要目的有:1、根据被测工件,搭建机器视觉测量系统,选择成像系统软件,进行图像采集等实验。

掌握常规机器视觉测量原理、实验平台搭建、图像采集步骤;2、掌握成像系统软件常用操作,能够对图像进行简单处理,并编写简单相关程序尺寸测量、缺陷检测判定;3、对测量结果进行误差分析,进一步加深理解机器视觉测量过程中的关键因素。

二、实验原理机器视觉主要是利用机器实现代替人眼来做测量和判断等目的,因此机器视觉可以看作是使用计算机及相关设备对生物视觉的一种模拟。

该实验就是通过对选取的工件进行图像采集和图像分析处理以获得所需物体的尺寸、缺陷等信息,一个典型的机器视觉系统包括:相机(包括COMS相机和CCD相机)、光源、镜头、图像获取单元(图像采集卡等)、显示器、图像处理软件、通讯设备、输入输出单元等。

本次实验借助HALCON机器视觉软件,它是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境,在欧洲以及日本的工业界已经是公认具有最佳效能的MachineVision软件。

它源自学术界,是一套图像处理库,由一千多个各自独立的函数,以及底层的数据管理核心构成。

其中包含了各类滤波、色彩分析以及几何、数学变换、形态学计算分析、校正、分类、辨识、形状搜索等等基本的几何以及图像计算功能。

HALCON支持Windows,Linux和MacOS X操作环境,函数库可以用C,C++,C#,Visual Basic 和Delphi等多种普通编程语言开发,为工业检测上提供了高速、高精度、强有力的方法。

机器视觉课内实验

机器视觉课内实验

机器视觉课内实验报告(4次)学院:自动化班级:智能姓名:学号:目录实验一:一种摄像机标定算法的编程实现 (1)实验二:图像预处理算法的编程实现 (8)实验三:基于一阶微分算子的边缘检测 (14)实验四:基于二阶微分算子的边缘检测 (17)《机器视觉》课内实验报告(1)摄像机标定算法的编程实现智能科学与技术专业:班级:学号:姓名:实验时间:实验一MATLAB 编程实现基于直接线性变换的摄像机标定方法一、实验目的掌握摄像机标定方法的原理,采用直接线性变换方法,通过MATLAB 编程实现摄像机内参数和外参数的估计。

二、实验原理摄像机标定是指建立摄像机图像像素位置与场景点位置之间的关系,其途径是根据摄像机模型,由已知特征点的图像坐标求解摄像机的模型参数。

直接线性变换是将像点和物点的成像几何关系在齐次坐标下写成透视投影矩阵的形式:其中(u ,v ,1)为图像坐标系下的点的齐次坐标,(X,Y,Z)为世界坐标系下的空间点的欧氏坐标,P 为3*4的透视投影矩阵,s 为未知尺度因子。

消去s ,可以得到方程组:当已知N 个空间点和对应的图像上的点时,可以得到一个含有2*N 个方程的方程组: 三、实验步骤1 读取一幅图像并显示;2 检查内存(数组)中的图像;3 实现图像直方图均衡化;4 读取图像中像素点的坐标值;5 保存图像;6 检查新生成文件的信息;7 使用阈值操作将图像转换为二值图像; 8 根据RGB 图像创建一幅灰度图像; 9 调节图像的对比度;10 在同一个窗口内显示两幅图像;11 掌握Matlab 命令及函数,获取标定块图像的特征点坐标;12 根据DLT 摄像机标定方法原理编写Matlab 程序,估计摄像机内参数和外参数;⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⨯1143w w w Z Y X P v u s 0034333231142322213433323114131211=----+++=----+++u p uZ p uY p uX p p Z p Y p X p u p uZ p uY p uX p p Z p Y p X p w w w w w w w w w w w w 0=AL四、程序代码及实验结果显示代码:I=imread('C:\Users\w\12.jpg');imshow(I);whosfigure,I1=rgb2gray(I);figure,imshow(I1)imhist(I1);I2=histeq(I1);figure,imshow(I2)figure,imhist(I2)a=imread('C:\Users\w\12.jpg');imwrite(I1,'DSgray.jpg');imwrite(I2,'DSgrayeq.jpg');inf=imfinfo('C:\Users\w\12.jpg');level=graythresh(I2);bw=im2bw(I2,level);figure,imshow(bw)whosI3=imadjust(I2,stretchlim(I2),[0 1]); figure,imshow(I3);a=imread('C:\Users\w\12.jpg');b=imread('DSgray.jpg');subplot(1,2,1),imshow(a);subplot(1,2,2),imshow(b);clear;xpot=[];ypot=[];imshow('C:\Users\w\12.jpg');hold on;n=input('Please input the number of pot:'); for i=1:n[x,y]=ginput(1);plot(x,y,'or');text(x+1,y+1,num2str(i));xpot=[xpot,x];ypot=[ypot,y];end[xpot;ypot][xw;yw;zw]a=[xw',yw',zw',ones([100 1]),zeros([100 4]),(-1)*xpot'.*xw',(-1)*xpot'.*yw',(-1)*xpot'.*zw',-1*xpot';zeros([1004]),xw',yw',zw',ones([100 1]),(-1)*ypot'.*xw',(-1)*ypot'.*yw',(-1)*ypot'.*zw',-1*ypot'];c=a(:,1:11);b=a(:,12);l=(-1)*(c'*c)^(-1)*c'*b;显示两幅图对比度调节均衡化直方图灰度图直方图二进制图图片信息:名称:12.jpg项目类型:JPG图像文件夹路径:C:\Users\w创建日期:2017年11月6日, 星期一 13:16修改日期:2017年11月6日, 星期一 13:16 大小:111KB分辨率:1024 x 638宽度:1024像素高度:638像素水平分辨率:72dpi垂直分辨率:72dpi位深度:24检查内存中的图像:Name Size Bytes Class AttributesI 638x1024x3 1959936 uint8 ans 2x15 240 doublei 1x1 8 doublen 1x1 8 doublex 1x1 8 doublexpot 1x15 120 doubley 1x1 8 doubleypot 1x15 120 doubleName Size Bytes Class AttributesI 638x1024x3 1959936 uint8 I1 638x1024 653312 uint8I2 638x1024 653312 uint8a 638x1024x3 1959936 uint8ans 2x15 240 doublebw 638x1024 653312 logicali 1x1 8 doubleinf 1x1 42720 structlevel 1x1 8 doublen 1x1 8 doublex 1x1 8 doublexpot 1x15 120 doubley 1x1 8 doubleypot 1x15 120 doublePlease input the number of pot:10ans =550.3592 391.7113 261.9085 521.5141 838.8099 921.7394 211.4296 117.6831 770.3028 957.7958463.7254 308.6831 146.4296 160.8521 283.4437 492.5704 460.1197 247.3873 113.9789 157.2465五、实验心得《机器视觉》课内实验报告(2)图像预处理算法的编程实现智能科学与技术专业:班级:学号:姓名:实验时间:实验二:图像预处理算法的编程实现一、实验目的掌握图像预处理的基本方法及其主要思想,编程实现直方图均衡化、直方图规定化和图像的锐化处理。

机器视觉实验报告

机器视觉实验报告

机器视觉实验报告
一、实验目的
本实验旨在探究机器视觉在图像识别和分析方面的应用,通过实际操作和数据分析,验证机器视觉技术的准确性和可行性。

二、实验装置与方法
1. 实验装置:使用具备机器视觉功能的摄像头和计算机软件。

2. 实验方法:
a. 首先,搜集一定数量的图像数据作为实验样本。

b. 接着,利用机器视觉软件对图像数据进行处理和分析。

c. 最后,对机器视觉技术的准确性和稳定性进行评估。

三、实验结果分析
通过实验数据的分析和比对,我们得出以下结论:
1. 机器视觉在图像识别方面具有较高的准确率,能够准确辨识不同物体和场景。

2. 机器视觉在图像分析方面具有较强的处理能力,能够提取图像特征和进行数据分析。

3. 机器视觉技术的稳定性较高,能够在复杂环境下正常工作并保持较高的准确性。

四、实验结论与展望
通过本次实验,我们验证了机器视觉技术在图像识别和分析方面的有效性和可靠性。

未来,随着技术的不断进步和应用领域的拓展,机器视觉将会在更多领域展示出其强大的功能和潜力,为人类生活和工作带来更多便利和效益。

以上为机器视觉实验报告的内容,希望能够对您有所帮助。

机器视觉的应用课程设计

机器视觉的应用课程设计

机器视觉的应用课程设计一、课程目标知识目标:1. 学生能理解机器视觉的基本概念,掌握其在实际应用中的原理和流程。

2. 学生能描述至少三种机器视觉技术的应用案例,并阐述其工作原理和关键功能。

3. 学生能运用已学的图像处理知识,分析并解决简单的机器视觉问题。

技能目标:1. 学生具备运用机器视觉软件进行基本图像捕捉、处理和分析的能力。

2. 学生能通过小组合作,设计并实施一个简单的机器视觉应用项目。

3. 学生能够运用批判性思维,评价机器视觉应用的优缺点,并提出改进方案。

情感态度价值观目标:1. 学生能够积极探究机器视觉技术在实际生活中的应用,培养对人工智能技术的兴趣和认识。

2. 学生在小组合作中,学会尊重他人意见,培养团队协作精神。

3. 学生能够关注机器视觉技术对社会生活的影响,认识到科技发展应遵循道德伦理原则,树立正确的科技价值观。

课程性质:本课程为高年级选修课程,旨在帮助学生将所学的图像处理知识应用于实际项目中,提高学生的实践能力和创新能力。

学生特点:学生具备一定的图像处理知识基础,对新鲜事物充满好奇,喜欢动手实践。

教学要求:注重理论与实践相结合,鼓励学生主动探索、合作学习,注重培养学生的实践能力和科技创新精神。

通过分解课程目标为具体的学习成果,使学生在完成课程后能够达到预定的知识、技能和情感态度价值观目标。

二、教学内容1. 机器视觉基础理论:- 介绍机器视觉的概念、发展历程及在我国的应用现状。

- 影像感知与图像处理基础知识回顾,如像素、分辨率、图像格式等。

2. 机器视觉技术与应用:- 分类介绍常见的机器视觉技术,如图像识别、目标跟踪、三维重建等。

- 分析典型应用案例,如工业检测、自动驾驶、医疗诊断等。

3. 机器视觉系统组成与工作原理:- 阐述机器视觉系统的硬件组成,如光源、镜头、相机、图像传感器等。

- 介绍机器视觉软件的功能、分类及选用原则。

4. 实践操作与项目设计:- 指导学生使用机器视觉软件进行图像捕捉、处理和分析。

机器人视觉建模课程设计

机器人视觉建模课程设计

机器人视觉建模课程设计一、教学目标本课程旨在通过学习机器人视觉建模,使学生掌握机器视觉的基本原理和方法,培养学生运用视觉信息处理技术解决实际问题的能力。

具体目标如下:1.理解机器视觉的基本概念、原理和应用。

2.掌握常用视觉信息处理技术,如图像处理、特征提取、目标识别等。

3.了解视觉建模的基本方法,包括几何建模、物理建模和统计建模等。

4.能够运用视觉信息处理技术进行简单的图像处理和分析。

5.能够运用视觉建模方法解决实际问题,如目标跟踪、场景重建等。

6.具备一定的编程能力,能够使用常见的视觉软件和工具。

情感态度价值观目标:1.培养学生对新技术的敏感性和好奇心,激发学生对领域的兴趣。

2.培养学生具备创新精神和团队合作意识,提高学生解决实际问题的能力。

3.培养学生具备良好的科学道德,注重实践与理论相结合,遵循学术规范。

二、教学内容本课程的教学内容主要包括以下几个部分:1.机器视觉概述:介绍机器视觉的基本概念、原理和应用领域。

2.图像处理技术:包括图像增强、滤波、边缘检测、特征提取等。

3.目标识别与跟踪:介绍目标识别的基本方法和跟踪技术。

4.视觉建模方法:包括几何建模、物理建模和统计建模等。

5.实践项目:结合实际案例,进行视觉建模项目的实践和训练。

三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式,包括:1.讲授法:通过讲解基本概念、原理和算法,使学生掌握视觉建模的基本知识。

2.案例分析法:分析实际案例,使学生更好地理解视觉建模的方法和应用。

3.实验法:让学生动手实践,培养学生的实际操作能力和解决问题的能力。

4.小组讨论法:分组进行讨论和实践,培养学生的团队合作意识和沟通能力。

四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《机器人视觉建模》,提供基本概念、原理和算法的介绍。

2.多媒体资料:包括PPT、教学视频等,用于辅助讲解和演示。

3.实验设备:包括计算机、摄像头等,用于实践操作和实验。

机器视觉课程设计报告书

机器视觉课程设计报告书

机器视觉课程设计对圆盘形零件I心与直径和矩形零件长与宽尺寸测量学生学院_______ 专业班级_____________________ 学号________________________ 学生_____________________指导教师_____________________2015年1月20日问题描述 (5)1. 1基本目标 (5)1.2基本要求 (5)程序及其算法 (5)2.1检测与计算圆半径的程序 (5)2.2检测与计算矩形长和宽的程序 (8)2. 2. 1打开摄像头程序 (8)2.2.2保存拍摄的照片程序 (9)2. 2. 3读取拍摄到的图片(读取文名字Current Image, jpg的图片) (9)2.2.4检测边上的点和计算长和高的函数 (9)2.2.5老师写的显示图片的函数 (13)运行结果 (14)小结 (15)1问题描述1.1基本目标显示一图片(包含一个矩形或一个圆),测量矩形的长宽或圆的直径。

完成得及格分,扩展有加分!要求图片1.2基本要求“机器视觉”考试结果要求独立在计算机上完成,建议使用Visual C++和OpenCV 实现一个具有视觉捕捉、图像显示、尺寸测量等功能的对话框程序,其中必须完成对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量容。

在教师提供的基本框架程序基础上,修改、补充界面和功能。

2程序及其算法2.1检测与计算圆半径的程序思路:从图片中间横扫取点得M_Point[0], M_Point[l] (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 z:m_pIplImageSource->width;int q_iHeight=m_pIplImageSource->height;int q__iWidthStep=m_pIpl ImageSource->widthStep;uchar *q_pchDataImage=(uchar *)m_pIp11mageSource->imageData:CvPoint M_Point[4] = {};//存放检索出的四个点循环检索//01纵扫for(int Cycle_Y=l;Cyc1e Y<q_iHeight;Cyc1e_Y++)if (e_dThreshold>q_pchDataImage[q_iWidth/2+q_iWidthStep*(Cycle_Y-l)J) { NLPoint[0].x=q_iWidth/2;M Point[01. y=Cycle Y;for(int cyclelYuq_iHeight;cycle —Y 〉l;CycleY I —)亠if(e —dThreshold 〉尸pchDat 巴mage 〔尸iwidth、2+Fiwidthstep*(cycle —Y —1)」)MPoint =〕• x=q —iwidth 、2"M PointLl〕・ yucycleY 八)}for(int Cycle xul 八 Cyclex 〈q —iwidthnyclex++)亠if(eldThreshold〉q_pchDataImage 〔cyclelx+尸iwidrhstep*(qliHeight、2丄)〕)3M Point 「2〕• xucyclelx; M Point 「2,- •yuq —iHeight'2”)} for(i nt Cycle XHq —iwid thnycl ex 〉1" Cycle X I —)亠rdThreshold〉尸pchDat 巴mage 「cycle —x2iwidthstep*(q 」Height、2丄)(M Point 「3〕•xucyclelx一MPoint 一3- •y=q —iHeight、2")}(i n t H-?i〈4“ i ++)、、画娱初El{cvCircle(m_plplImageSource,M_Point[i],8,cvScalarAl1 (127),2);}int Ridius=O t clear=O;int c i rc1e_y=abs(M Po i n111J. y+M Point I 0]. y)/2;int circ1e_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-cirele x)*(M_Point[i]・ x-cirele x) + (M_Point[i]・ y-circle_y )*(M_Point[i]. y-circle_y);c=c+sqrt(j);}Ridius=c/4;//在窗口中显示长和高char chi[101,ch2[101;itoa(Ridius,chi,10);itoa (clear,ch2t10);SetDlgltemText(IDC LONG,chi);SetDlgltemText(IDC_SHORT,ch2);CWnd *e_pCWndPicture=this->GetDlgItem(ID PICTURE DISPLAY);fContro1ShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource); cvSavelmage( T("・//Result_Image・ jpg"),m_plplImageSource);return 0;}2.2检测与计算矩形长和宽的程序思路:这个程序主要包括:打开摄像头-一保存图片(拍照)-一加载刚刚保存的图片-一找出点并计算长和高四个按钮,每一个按钮包含下面的一段代码,拍摄的图片保存为Currentimage, jpg,这里事先保存了一同名的图片,所以可以直接点击Load Image 读取。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

机器视觉课程设计对圆盘形零件圆心与直径和矩形零件长与宽尺寸测量学生学院机电学院专业班级学号学生指导教师2015年 1 月 20 日目录1 问题描述 (5)1.1 基本目标 (5)1.2 基本要求 (5)2 程序及其算法 (5)2.1 检测与计算圆半径的程序 (5)2.2 检测与计算矩形长和宽的程序 (8)2.2.1 打开摄像头程序 (8)2.2.2 保存拍摄的照片程序 (9)2.2.3 读取拍摄到的图片(读取文名字CurrentImage.jpg的图片) (9)2.2.4 检测边上的点和计算长和高的函数 (9)2.2.5 老师写的显示图片的函数 (13)3 运行结果 (14)4 小结 (15)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<q_iHeight;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<q_iWidth;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){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::OnBnClickedButton SaveImage(){// TODO: 在此添加控件通知处理程序代码cvSaveImage(_T(".//CurrentImage.jpg"),m_pIplImageSource);}2.2.3 读取拍摄到的图片(读取文名字CurrentImage.jpg的图片)void c_DialogTeclarn::OnBnClickedButton LoadImage(){// 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_pchDataImage[q_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_pchDataImage[q_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_pchDataImage[q_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_pchDataImage[q_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_pchDataImage[q_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_pchDataImage[q_iCycleWidth+q_iWidthStep*(q_iYRightMid-1)]) {q_CvPointRight_Mid.x=q_iCycleWidth;q_CvPointRight_Mid.y=q_iYRightMid;break;}}//在检测到的点上画圆,只是为了更好看到找点的情况cv Circle(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_Control ShowImage(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;//定义行列式doublearr[9]={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;//定义行列式DoubleARR[9]={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 ch1[10],ch2[10];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::OnBnClickedButton Rectangle(){// 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_piBuffer[sizeof(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++){palette[q_iCycle].rgbBlue=(BYTE)q_iCycle;palette[q_iCycle].rgbGreen=(BYTE)q_iCycle;palette[q_iCycle].rgbRed=(BYTE)q_iCycle;palette[q_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 小结通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。

相关文档
最新文档