《工业机器视觉技术及应用》课件_第5章.pptx

上传人(卖家):kld 文档编号:8242998 上传时间:2025-01-22 格式:PPTX 页数:273 大小:1.39MB
下载 相关 举报
《工业机器视觉技术及应用》课件_第5章.pptx_第1页
第1页 / 共273页
《工业机器视觉技术及应用》课件_第5章.pptx_第2页
第2页 / 共273页
《工业机器视觉技术及应用》课件_第5章.pptx_第3页
第3页 / 共273页
《工业机器视觉技术及应用》课件_第5章.pptx_第4页
第4页 / 共273页
《工业机器视觉技术及应用》课件_第5章.pptx_第5页
第5页 / 共273页
点击查看更多>>
资源描述

1、第五章第五章 C#C#软件及软件及HalconHalcon、OpenCVOpenCV5.1 C+和和C#语言概语言概述述5.2 Halcon简介简介5.3 OpenCV5.1 C+和和C#语言概述语言概述1C+语言概述语言概述世界上第一种计算机高级语言是诞生于1954年的FORTRAN语言。1970年,美国电话电报公司(AT&T)Bell实验室的D.Ritchie和K.Thompson共同发明了C语言,研制C语言的初衷是用于编写UNIX系统程序。1979年,Bell实验室的Bjame Sgoustrup开始将C语言改良为带类的C的开发工作,1983年被正式命名为C+语言。运行C+语言程序需要编

2、译程序和链接程序两步。编译程序是编译器将C+语句转换成机器码(也称为目标码)。链接程序是链接器将编译获得的机器码与C+库中的代码进行合并。C+语言的程序属于编译型程序。运行C+语言的程序需要两步:第一步是编译程序。编译器将C+语句转换成机器码;第二步是链接程序。链接器将编译获得机器码与C+库中的代码进行合并。C+语言被公认为功能最强大的程序之一,它具有以下特点:1)支持数据封装和数据隐藏在C+语言中,类是支持数据封装的工具,对象是数据封装的实现。C+语言通过建立用户定义类支持数据封装和数据隐藏。在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类。对象为具有一个给定类

3、的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。类一旦建立,就可看成完全封装的实体,而作为一个整体单元使用。2)支持继承和重用在C+语言中现有类的基础上可以声明新类型,即支持继承和重用。通过继承和重用,可以更有效地组织程序结构,明确类间的关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类,可以从父类继承所有非私有的属性和方法,作为自己的成员。由于存在继承性,因此这些对象共享许多相似的特征。3)支持多态性采用多态性为每个类指定表现行为。多态性形成由父类及其子类组成的一个树型结构。在树中的子类可以接收一个或多个具有相同名字的消息。当消息被树

4、中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。2C#语言概述语言概述C#语言(读为C Sharp)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言31,其是由C语言和C+语言衍生出来的面向对象的编程语言,具有安全、稳定、简单、优雅等特点。在继承C语言和C+语言强大功能的同时,去掉了一些复杂特性(如没有宏、不允许多重继承)。C#语言综合了VB简单的可视化操作和C+语言的高运行效率,因其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持,成为.NET开发的首选语言。C#语言程序需要.NET运行库作为基础,而.

5、NET运行库作为Windows的一部分,在一些版本较旧的Windows平台上不能运行。C#语言能够使用的组件或库只有.NET运行库等有限的选择,没有丰富的第三方软件库支持。相比而言,C+语言的设计目标是低级的、与平台无关的面向对象的编程,C#语言则是一种高级的面向组件的编程语言。C#语言不再处理细微的控制,而是让架构来处理这些重要的问题。两者各有优势,可根据需求合理选择。5.2.1 Halcon基础基础Halcon是德国MVtec公司开发的一套完善的、标准的机器视觉算法包,拥有广泛的机器视觉集成开发环境32。其应用范围广泛,只要用得到图像处理的地方,就可以用Halcon强大的计算分析来完成工作

6、,涵盖医学、遥感探测、监控,再到工业上的各类自动化检测,如宇宙航空和太空旅行、汽车零件制造、制陶业、电子元件和设备、玻璃制造和生产、身体健康和生命科学、精密工程和光学、保安监控及通讯等。5.2 Halcon简介简介1Halcon的特点的特点Halcon具有如下特点:(1)功能模块丰富:Halcon由一千多个各自独立的函数,以及底层的数据管理核心构成,包含了各类滤波、数学转换、形态学计算分析、校正、分类辨识、形状搜寻等计算功能。(2)Halcon与硬件独立:Halcon支持绝大部分图像采集卡,为百余种工业相机和图像采集卡提供接口,包括GenlCam,GigE和TEEE 1394,从而确保了硬件的

7、独立性。(3)支持多种操作系统和编程语言:Halcon支持Windows操作系统、Linux系统和Mac OSX系统,Halcon整个函数库可以用C、C+、C#、Visual Basic和Delphi等多种普通编程语言访问。(4)资源需求小:使用Halcon设计人机接口时没有特别的限制,可以完全使用开发环境下的程序语言架构自己的接口,对执行作业机器的资源要求不高。(5)易于开发:为了提高开发视觉系统的效率,Halcon包含了一套交互式的程序设计接口HDevelop,可以用Halcon程序代码直接编写、修改、执行程序,并且可以查看计算过程中的所有变量。设计完成后,可以直接输出C、C+、COM、V

8、B语言等程序代码,并嵌入到程序中。(6)紧跟前沿:Halcon提供了极为突出的新技术,如三维表面比较,即将一个三维物体的表面形状测量结果与预期形状进行比较。Halcon提供的所有三维技术(如多目立体视觉),都可用于表面重构,支持直接通过现成的三维硬件扫描仪进行三维重构。另外,Halcon现在还支持许多三维目标处理的方法,如点云的计算和三角测量、形状和体积特征计算、点云分割等。自动算子并行处理技术是Halcon的一个独特性能。2Halcon的语法结构特点的语法结构特点Halcon可与C#、C+语言实现交互的模式有:(1)算子模式:以C#为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下

9、,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两种类型进行声明。(2)面向对象模式:以面向对象的方式重写代码。3Halcon的数据类型的数据类型Halcon支持的数据类型有控制变量、图形、数组及句柄。数组可以用一个变量传递多个对象,可以由重载后的函数来处理。不同类型数组的下标起始值有所差异,图形数组的下标从1开始,控制变量数组下标从0开始。句柄不能是常量,可用来描述窗体、文件等。在Halcon的参数中,参数包括图形参数和控制系数。1)图形参数Iconic 图形参数Iconic主要包括Image、Regions和XLD三个参数。(1)Image。在Halcon中,Imag

10、e=Channel+Domain,像素点存放在Channel矩阵中,根据ROI来描述Image。(2)Regions。Regions以行列坐标形式储存,并有广泛的应用。其特点是高效,可利用同态算子,如用阈值对图像分割结果。(3)XLD。图像均用像素点保存,而像素点是整型的、不连续的,Halcon做了拓展,定义了亚像素(Subpixel)描述几何轮廓的对象:XLD(Extended Line Description),主要用在亚像素测量的背景下,可用于提取边缘、构建轮廓等应用,另外,在模板匹配、图形校准等多方面有重要的应用。2)控制参数Control控制参数Control包括string、int

11、eger、real和handle四个参数。String类型变量由单引号括起来,此外还有一些特殊字符;Boolean型变量包括true(1)、false(0)。4Halcon的基本语句的基本语句1)赋值语句赋值语句是Halcon中最基础的语句,其中Assign算子为赋值语句,对数据赋值,如Assign(Input,Result)。Input为输入参数;Result为赋值结果。Assign的使用如图5-1所示。图5-1 算子窗口运行结果如图5-2所示。图5-2 程序编辑器输出结果2)运算符Halcon包含了基本的算术运算、位运算、字符串操作、比较操作符、逻辑操作符及数学函数等。算术运算有加(+)、

12、减(-)、乘(*)、除(/)、取余(%)、取负(-)。位运算有左移(lsh(i,i)、右移(rsh(i,i)、位与(i band i)、位或(i bor i)、位异或(i bxor i)、取反(bnot i)。逻辑运算符用于连接布尔型表达式,有非(not)、与(and)、或(or)、异或(xor)。3)数学函数与其他编程语言一样,Halcon提供了大量的常用数学函数,常用的有三角函数、双曲线函数、指数函数(exp)、对数函数(log、log10)、幂函数(pow、ldexp)。三角函数有正弦(sin)、余弦(cos)、正切(tan)、反正弦(asin)、反余弦(acos)、反正切(atan、a

13、tan2)、双曲正弦(sinh)、双曲余弦(cosh)、双曲正切(tanh)。同时,Halcon还提供了统计类函数、转换类函数及其他函数,如表5-1、5-2和5-3所示。4)数组数组是Halcon常用的变量,常用数组操作有创建数组、添加数组元素、连接数组、删除数组元素等。(1)创建数组。利用Halcon算子创建数组常用的方法有两种。第一种方法是创建指定长度且元素相同的数组,并利用tuple_gen_const算子初始化。tuple_gen_const(Length,Const,Newtuple)其中,Length为数组的长度;Const为初始化的常数;Newtuple为所产生数组的命名。例5.

14、1 创建一个长度为10,元素为6的数组Newtuple。tuple_gen_const(10,6,Newtuple)运行结果为:Newtuple 6,6,6,6,6,6,6,6,6,6第二种方法是创建不同元素的数组,需要借助循环语句对数组中的每一个元素赋值。例5.2 创建10个不同元素的数组。(2)添加数组元素。在实际应用中,经常向数组中添加元素。通过Tuple_insert算子实现数组元素的添加,其形式如下:Tuple_insert(Tuple,Index,InsertTuple,Extended)/编辑形式例5.3初始化数组OriginalTuple:OriginalTuple:=0,1,

15、2,3,4,5 向数组OriginalTuple的第3个位置插入字符x(索引从0开始):tuple_insert(OriginalTuple,3,x,InsertSingleValueA)向数组OriginalTuple的第3个位置插入字符x:InsertSingleValueB:=insert(OriginalTuple,3,x)向数组OriginalTuple的第1个位置插入字符y,z:tuple_insert(OriginalTuple,1,y,z,InsertedMultipleValuesA)向数组OriginalTuple的第1个位置插入字符x:InsertedMultipleVa

16、luesB:=insert(OriginalTuple,1,y,z)向数组OriginalTuple的第6个位置插入字符x,y,z:tuple_insert(OriginalTuple,6,x,y,z,AppendedA)向数组OriginalTuple的第6个位置插入字符x,y,z:AppendedB:=insert(OriginalTuple,6,x,y,z)数组常用操作有连接、计算长度、提取元素、删除元素等操作,如表5-4所示。5Halcon结构语句结构语句Halcon结构语句有顺序结构语句、循环结构语句和分支结构语句。(1)顺序结构语句。Halcon程序是以顺序结构语句为主,即先执行第

17、一条语句,接着是第二条、第三条一直到最后一条语句,这称为顺序结构语句。(2)循环结构语句。循环结构语句用于执行重复的语言,循环结构语句有三种形式:for.endfor;本语句条件不满足,循环体不执行;满足条件才执行。while.endwhile;本语句条件不满足,循环体不执行;满足条件才执行。repeat.until;本语句的循环体至少被执行一次,直到满足条件时退出。(3)分支结构语句。分支结构语句根据给定的条件判断,以决定执行哪个分支程序段。分支结构语句有:if.endif;根据条件是否成立,决定是否执行代码,用于两分支结构中。if.else.endif;根据条件是否成立,决定是否执行代码,

18、用于两分支结构中。if.elseif.else.endif;本语句主要用于多分支结构中。此外,还有一些关键词可用来控制语句执行顺序,改变程序结构顺序,常用的有 break(终止程序循环而执行循环后的语句)、continue(跳出循环体中剩余的语句,而强制执行下一次循环)、return(返回)、exit(终止Halcon程序并退出)、stop(终止后面的循环)。5.2.2 Halcon算子算子从狭义上讲,算子是一个函数空间到另一个函数空间的映射。从广义上讲,算子是指对任何函数进行某项操作。Halcon提供了大量便于操作的算子,常见的算子有分类算子、控制算子、Develop算子、文件操作算子、滤波

19、算子、图形算子、图像算子、线算子、匹配算子、3D匹配算子、Morphology算子、光字符识别算子、对象算子、区域算子、分割算子、系统算子、工具算子、数组算子、图形变量算子等几十类算子。5.3 OpenCV5.3.1 OpenCV的特点的特点1999年,Intel研究中心开发的OpenCV公布,是一个基于BSD(Berkly Software Distribution)许可的开源发行的跨平台计算机视觉库33。在Intel工作的OpenCV团队发现许多顶尖大学中的研究组拥有内部使用的开放计算机视觉库,以方便学生间互相传播学习,帮助新生从高的起点开始计算机视觉研究,从而使得学者不用从底层写基本函数

20、,而在某些基础上继续开始研究。与Halcon最大的区别在于,OpenCV是开源的计算机视觉库,采用C/C+语言编写,可运行在Linux/Windows/Mac等操作系统上,还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV的设计目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。OpenCV包含的函数有500多个,覆盖了计算机视觉的许多应用领域。5.3.2 OpenCV的构架的构架OpenCV的构架包括基本结构、数组操作、动态结构、绘图函数、数据保存和运行时类型信息、错误处理和系统函数、图像处理、结构分析、运动分析、模式识

21、别、相机标定和三维重建等模块。1基本结构基本结构(1)二维坐标系下点的表示方法:(2)二维坐标下点的表示方法(类型为浮点型):(3)三维坐标下点的表示方法(类型为浮点型):(4)矩形框大小的表示方法(以像素为精度):(5)以亚像素精度标量矩形框大小的表示方法:(6)矩形框的偏移和大小的表示方法:(7)可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的表示方法:(8)迭代算法的终止准则的表示方法:(9)多通道矩阵的表示方法:(10)多维、多通道密集数组的表示方法:(11)多维、多通道稀疏数组的表示方法:(12)IPL图像头的表示方法:IPL是Image Processing Library

22、简写。IplImage是OpenCV中CxCore部分基础的数据结构,用来表示图像。(13)不确定数组的表示方法:typedef void CvArr;CvArr*仅仅是被用于函数的参数,用于指示函数接收的数组类型可以不止一个,如IplImage*、CvMat*、CvSeq*。最终的数组类型是在运行时通过分析数组头的前4个字节判断的。2数组操作数组操作 常用的数组操作有初始化、获取元素和数组子集、拷贝和添加、变换和置换、算术/逻辑/比较、统计、线性代数、数学函数、随机数生成、离散变换等。1)初始化(1)创建头并分配数据:IplImage*cvCreateImage(CvSize size,in

23、t depth,int channels);(2)分配及初始化,且返回IpIImage结构:IplImage*cvCreateImageHeader(CvSize size,int depth,int channels);(3)释放头:void cvReleaseImageHeader(IplImage*image);(4)释放头和图像数据:void cvReleaseImage(IplImage*image);(5)初始化被用图分配的图像头:IplImage*cvInitImageHeader(IplImage*image,CvSizesize,intdepth,int channels,i

24、nt origin=0,int align=4);(6)制作图像的完整拷贝:IplImage*cvCloneImage(const IplImage*image);(7)基于给定的值设置感兴趣通道:void cvSetImageCOI(IplImage*image,int coi);(8)返回感兴趣通道:int cvGetImageCOI(const IplImage*image);(9)基于给定的矩形设置感兴趣区域:void cvSetImageROI(IplImage*image,CvRect rect);(10)释放图像的ROI(感兴趣区域,Region of Interesting):

25、void cvResetImageROI(IplImage*image);(11)返回图像的ROI坐标:CvRect cvGetImageROI(const IplImage*image);(12)创建矩阵:CvMat*cvCreateMat(int rows,int cols,int type);(13)创建新的矩阵头:CvMat*cvCreateMatHeader(int rows,int cols,int type);(14)删除矩阵:void cvReleaseMat(CvMat*mat);(15)初始化矩阵头:CvMat*cvInitMatHeader(CvMat*mat,intro

26、ws,intcols,inttype,Void*data=NULL,int step=CV_ AUTOSTEP);(16)初始化矩阵头:CvMat cvMat(int rows,int cols,int type,void*data=NULL);(17)创建矩阵拷贝:CvMat*cvCloneMat(const CvMat*mat);(18)创建多维密集数组:CvMatND*cvCreateMatND(int dims,const int*sizes,int type);(19)创建新的数组头:CvMatND*cvCreateMatNDHeader(int dims,const int*siz

27、es,int type);(20)删除多维数组:void cvReleaseMatND(CvMatND*mat);(21)初始化多维数组头:CvMatND*cvInitMatNDHeader(CvMatND*mat,int dims,const int*sizes,int type,void*data=NULL);(22)创建多维数组的完整拷贝:CvMatND*cvCloneMatND(const CvMatND*mat);(23)缩减数组数据的参考计数:void cvDecRefData(CvArr*arr);(24)增加数组数据的参考计数:int cvIncRefData(CvArr*ar

28、r);(25)分配数组数据:void cvCreateData(CvArr*arr);(26)释放数组数据:void cvReleaseData(CvArr*arr);(27)指派用户数据给数组头:void cvSetData(CvArr*arr,void*data,int step);(28)返回组数的底层信息:void cvGetRawData(const CvArr*arr,uchar*data,int*step=NULL,CvSize*roi_size=NULL);(29)从不确定数组返回矩阵头:CvMat*cvGetMat(const CvArr*arr,CvMat*header,i

29、nt*coi=NULL,int allowND=0);(30)从不确定数组返回图像头:IplImage*cvGetImage(const CvArr*arr,IplImage*image_header);(31)创建稀疏数组:CvSparseMat*cvCreateSparseMat(int dims,const int*sizes,int type);(32)删除稀疏数组:void cvReleaseSparseMat(CvSparseMat*mat);(33)创建稀疏数组的拷贝:CvSparseMat*cvCloneSparseMat(const CvSparseMat*mat)。2)获取

30、元素和数组子集(1)根据输入的图像返回矩阵头:CvMat*cvGetSubRect(const CvArr*arr,CvMat*submat,CvRect rect);(2)返回数组的行或在一定跨度内的行:CvMat*cvGetRow(const CvArr*arr,CvMat*submat,int row);CvMat*cvGetRows(const CvArr*arr,CvMat*submat,int start_row,int end_row,int delta_row=1);(3)返回数组的列或在一定跨度内的列:CvMat*cvGetCol(const CvArr*arr,CvMat*

31、submat,int col);CvMat*cvGetCols(const CvArr*arr,CvMat*submat,int start_col,int end_col);(4)返回一个数组对角线:CvMat*cvGetDiag(const CvArr*arr,CvMat*submat,int diag=0);(5)返回图像或矩阵ROI大小:CvSize cvGetSize(const CvArr*arr);(6)初始化稀疏数线元素迭代器:CvSparseNode*cvInitSparseMatIterator(constCvSparseMat*mat,CvSparseMatIterato

32、r*mat_iterator);(7)初始化稀疏数线元素迭代器:CvSparseNode*cvGetNextSparseNode(CvSparseMatIterator*mat_iterator);(8)返回数组维数和他们的大小或者殊维的大小:int cvGetDims(const CvArr*arr,int*sizes=NULL);int cvGetDimSize(const CvArr*arr,int index);(9)返回指向特殊数组元素的指针:uchar*cvPtr1D(const CvArr*arr,int idx0,int*type=NULL);uchar*cvPtr2D(con

33、st CvArr*arr,int idx0,int idx1,int*type=NULL);uchar*cvPtr3D(const CvArr*arr,int idx0,int idx1,int idx2,int*type=NULL);uchar*cvPtrND(const CvArr*arr,int*idx,int*type=NULL,int create_node=1,unsigned*precalc_hashval=NULL);(10)返回特殊的数组元素:CvScalar cvGet1D(const CvArr*arr,int idx0);CvScalar cvGet2D(const C

34、vArr*arr,int idx0,int idx1);CvScalar cvGet3D(const CvArr*arr,int idx0,int idx1,int idx2);CvScalar cvGetND(const CvArr*arr,int*idx);(11)返回单通道数组的指定元素:double cvGetReal1D(const CvArr*arr,int idx0);double cvGetReal2D(const CvArr*arr,int idx0,int idx1);double cvGetReal3D(const CvArr*arr,int idx0,int idx1,

35、int idx2);double cvGetRealND(const CvArr*arr,int*idx);(12)返回单通道浮点矩阵指定元素:double cvmGet(const CvMat*mat,int row,int col);(13)修改指定的数组:void cvSet1D(CvArr*arr,int idx0,CvScalar value);void cvSet2D(CvArr*arr,int idx0,int idx1,CvScalar value);void cvSet3D(CvArr*arr,int idx0,int idx1,int idx2,CvScalar value

36、);void cvSetND(CvArr*arr,int*idx,CvScalar value);(14)修改指定数组元素值:void cvSetReal1D(CvArr*arr,int idx0,double value);void cvSetReal2D(CvArr*arr,int idx0,int idx1,double value);void cvSetReal3D(CvArr*arr,int idx0,int idx1,int idx2,double value);void cvSetRealND(CvArr*arr,int*idx,double value);(15)返回单通道浮点

37、矩阵的指定元素:void cvmSet(CvMat*mat,int row,int col,double value);(16)清除指定数组元素:void cvClearND(CvArr*arr,int*idx);3)拷贝和添加(1)将A数组拷贝到B数组:void cvCopy(const CvArr*src,CvArr*dst,const CvArr*mask=NULL);(2)为数组的每个元素设置数值:void cvSet(CvArr*arr,CvScalar value,const CvArr*mask=NULL);(3)清空数组:void cvSetZero(CvArr*arr);#d

38、efine cvZero cvSetZero 4)变换和置换(1)将数组中所有元素初始化:void cvSetZero(CvArr*arr);(2)修改多维数组形状:CvArr*cvReshapeMatND(const CvArr*arr,int size of_header,CvArr*header,int new_cn,int new_dims,int*new_sizes);(3)把src通道式填充到dst中:void cvRepeat(const CvArr*src,CvArr*dst);(4)cvFlip直接从图像采集卡采集的图像cvShowImage是反着的图像,也就是说图像采集卡采

39、集的图像是以左下角为原点的,而窗口显示的图像原点是左上角,相当于是关于X轴翻转了。在显示图像之前使用cvFlip()函数将图像翻转。void cvFlip(const CvArr*src,CvArr*dst=NULL,int flip_mode=0);(5)cvSplit分别复制每个通道到多个单通道图像:void cvSplit(const CvArr*src,CvArr*dst0,CvArr*dst1,CvArr*dst2,CvArr*dst3);(6)从几个单通道数组组合多通道数组:void cvMerge(const CvArr*src0,const CvArr*src1,const C

40、vArr*src2,const CvArr*src3,CvArr*dst);5)算术、逻辑和比较(1)利用搜索表转换数组:void cvLUT(const CvArr*src,CvArr*dst,const CvArr*lut);(2)利用线性变换转换数组:void cvConvertScale(const CvArr*src,CvArr*dst,double scale=1,double shift=0);(3)使用线性变换转换输入数组元素为 8位无符号整型:void cvConvertScaleAbs(const CvArr*src,CvArr*dst,double scale=1,dou

41、ble shift=0);(4)计算两个数中每个元素的和:void cvAdd(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL);(5)计算数量和数组的和:void cvAddS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(6)计算两数组的加权值的和:void cvAddWeighted(const CvArr*src1,double alpha,const CvArr*src2,double beta,double gamm

42、a,CvArr*dst);(7)计算两个数组每个元素的差:void cvSub(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL);(8)计算数组和数量之间的差:void cvSubS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(9)计算数量和数组之间的差:void cvSubRS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(10)计算两个数组

43、中每个元素的积:void cvMul(const CvArr*src1,const CvArr*src2,CvArr*dst,double scale=1);(11)实现除法的函数,用src2除以src1中对应元素,结果存到dst中相除:void cvDiv(const CvArr*src1,const CvArr*src2,CvArr*dst,double scale=1);(12)计算两个数组的每个元素的按位与:void cvAnd(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL);(13)计算数组每个元素

44、与数量之间的按位与:void cvAndS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(14)计算两个数组每个元素的按位或:void cvOr(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL);(15)计算数组中每个元素与数量之间的按位或:void cvOrS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(16)计算两个数组中的每个元素的按位异

45、或:void cvXor(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL);(17)计算数组元素与数量之间的按位异或:void cvXorS(const CvArr*src,CvScalar value,CvArr*dst,const CvArr*mask=NULL);(18)计算数组元素的按位取反:void cvNot(const CvArr*src,CvArr*dst);(19)比较两个数组元素:void cvCmp(const CvArr*src1,const CvArr*src2,CvArr*dst,i

46、nt cmp_op);(20)比较数组的每个元素与数量的关系:void cvCmpS(const CvArr*src,double value,CvArr*dst,int cmp_op);(21)检查数组元素是否在两个数组之间:void cvInRange(const CvArr*src,const CvArr*lower,const CvArr*upper,CvArr*dst);(22)检查数组元素是否在两个数量之间:void cvInRangeS(const CvArr*src,CvScalar lower,CvScalar upper,CvArr*dst);(23)查找两个数组中每个元素

47、的较大值:void cvMax(const CvArr*src1,const CvArr*src2,CvArr*dst);(24)查找数组元素与数量之间的较大值:void cvMaxS(const CvArr*src,double value,CvArr*dst);(25)查找两个数组元素之间的较小值:void cvMin(const CvArr*src1,const CvArr*src2,CvArr*dst);(26)查找数组元素和数量之间的较大值:void cvMinS(const CvArr*src,double value,CvArr*dst);(27)计算两个数组差的绝对值:void

48、 cvAbsDiff(const CvArr*src1,const CvArr*src2,CvArr*dst);(28)计算数组元素与数量之间差的绝对值:void cvAbsDiffS(const CvArr*src,CvArr*dst,CvScalar value);6)统计(1)计算非零数组元素:int cvCountNonZero(const CvArr*arr);(2)计算数组元素的和:CvScalar cvSum(const CvArr*arr);(3)计算数组元素的平均值:CvScalar cvAvg(const CvArr*arr,const CvArr*mask=NULL);(

49、4)计算数组元素的平均值:void cvAvgSdv(const CvArr*arr,CvScalar*mean,CvScalar*std_dev,const CvArr*mask=NULL);(5)查找数组和子数组的全局小值和大值:Void cvMinMaxLoc(const CvArr*arr,double*min_val,double*max_val,CvPoint*min_loc=NULL,CvPoint*max_loc=NULL,constCvArr*mask=NULL);(6)计算数组的绝对范数,绝对差分范数或者相对差分范数:double cvNorm(const CvArr*ar

50、r1,const CvArr*arr2=NULL,int norm_type=CV_L2,const CvArr*mask=NULL);7)线性代数(1)初始化带尺度的单位矩阵:void cvSetIdentity(CvArr*mat,CvScalar value=cvRealScalar(1);mat(2)用欧几里得准则计算两个数组的点积:double cvDotProduct(const CvArr*src1,const CvArr*src2);(3)计算两个三维向量的叉积:void cvCrossProduct(const CvArr*src1,const CvArr*src2,CvAr

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《工业机器视觉技术及应用》课件_第5章.pptx)为本站会员(kld)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|