EmguCV类(CvInvoke_Class) 方法整理

合集下载

图像处理编程总结

图像处理编程总结

EmguCV编程总结学习C#图像处理编程有一段时间了,然后写写自己的已经积累的经验,网上有关于C#数字图像处理的资料很少,教程方面,专门为C#数字图像处理的到目前为止我就看到了三本,这三本的内容都是利用GDI+来做图像处理的。

GDI+为我们提供了图像处理所需要的一些类,还有一些函数。

在结合C#做界面的优势,因此做图像处理我个人感觉要比c++和opencv方便,opencv中有强大的算法,但是就是这个界面不友好。

在GDI+中只是提供了图像处理的类,还有少量的函数,如果真正要做处理,大量的函数还是的需要自己编写,我看到的这三本书上讲的基本上都是编写这些函数的内容,在GDI+编程中对图像处理通常有三种方式,第一种是利用纯C#的方式,理解简单,但是效率差。

第二种是内存法,理解稍微困难点,但是效率比纯C#的要高几百倍。

第三种就是在C#下利用指针了,当然利用指针就是效率最高的了,比内存法都要效率高,但是指针的理解比较困难,如果退指针理解还可以,就推荐用这种方法。

在前面的文章中我对比过在C#中用这三种方式灰度化图像的运行效率对比,还给出了具体时间。

我看到的这三本C#图像处理的书上,其中一本的算法是按照内存法来写的,其他两本上的算法都是按照纯C#方法写的,效率令人堪忧。

当然还有一些关于GDI+的书籍,这上面就介绍的内容就不单单是图像方面的处理了,还包括其他方面的内容,这是对学软件计算机的人看的,我们了解下就可以,再说,上面处理的方式都是纯C#的方式处理的,对我们图像处理来说效率实在不好,所以看看就好。

因此,C#图像处理的话,我推荐的是指针的方法,效率最好,速度快。

这是我们直接用C#来图像处理,当然大多数算法还得自己编写程序,反正我看到的教材上都是这样教的,但是实际中,我们写大量成熟的算法是很花时间的,估计写完这些都花个好几年时间了,因此,我们还得需要一些计算机视觉处理的库,调用其中的函数完成主要的处理功能。

有本名字叫《EmguCV Essentials》的书上就对现在常见的库做了对比,这本书上对比了有三种计算机视觉库,有opencv,EmguCV,这三种库。

EmguCV耦合视觉引导的图像目标定位与补偿技术研究

EmguCV耦合视觉引导的图像目标定位与补偿技术研究

EmguCV耦合视觉引导的图像目标定位与补偿技术研究王帮元【摘要】在平板电脑组装过程中,需要对背光板进行整体定位,传送给机械机构进行位移和角度补偿,从而实现精准组装.但由于背光板顶点背景复杂,往往存在很多干扰点,使得当前图像角点定位算法定位不准,易产生误差.对此提出了一个基于EmguCV与视觉引导的目标定位与引导机制.首先打通Basler SDK与C#-Emgucv 平台的数据通道,实现图像采集;然后基于轮廓,查找到背光板区域,再通过最小矩形框定背光板,查找背光板顶点,实现定位;最后计算出水平、垂直方向偏移和旋转角度,联合PLC,实现基于视觉引导的机构补偿.测试定位补偿技术的性能结果表明:与当前图像角点定位算法相比,机制具有更好的定位与引导效果,准确定位出背光板顶点,计算出补偿值.【期刊名称】《湖北民族学院学报(自然科学版)》【年(卷),期】2015(033)001【总页数】5页(P43-47)【关键词】图像定位;背光板;视觉引导;EmguCV;最小矩形;机构补偿【作者】王帮元【作者单位】安徽经济管理学院信息工程系,安徽合肥230051【正文语种】中文【中图分类】TP391随着电子行业产业化的推进,机器视觉技术在该领域内得到广泛应用,并且已在很大程度上推动了行业生产力发展[1-3].机器视觉的作用主要有:视觉引导、缺陷检测等[4-6],其中的目标定位是视觉引导的关键,也是前提,尤其是角点定位.在平板电脑自动组装中,电脑零部件背光板的位置经常需要传递给机器人的机械手臂,实现精准抓取.因此,对背光板顶点的准确定位直接影响到产品的质量和效率.对此,已有部分学者设计了相应的角点目标定位算法,并且达到了一定的效果.如利用梯度均方差进行特征分析后提取角点的定位算法[7].还有利用局部图像区域直方图特性定位角点的定位算法.这些算法的实验结果表明其具有良好的视觉定位效果[8].尽管上述这些角点定位机制能够取得较好的效果;但是当目标存在干扰时,这些算法的定位精度较低,存在明显的定位偏差.对此,本文提出了一个基于Emgucv 与视觉引导的定位机制.首先打通相机SDK 与C#-Emgucv 平台的数据通道,实现图像采集;然后基于轮廓匹配得到背光板区域,再通过最小矩形框定背光板后查找背光板顶点,实现定位.最后计算出水平、垂直方向偏移和旋转角度,实现基于视觉引导的机构补偿.最后通过实验,验证了本文算法与传统定位算法的定位性能.1 本文整体定位与引导机制由于一块反光板上有三个顶点需要定位,因此本文机制采用2 个摄像头分2 次抓取三个顶点所在视野,然后分别定位.考虑到C#在界面、运行效率、通信方面比较有优势,故选用C#语言开发软件系统,且在C#平台上调用Emgucv 也很方便.首先研究相机C#版本的SDK 底层函数,然后用C#进行调取,并且转换为bitmap、Emgucv 图像格式,实现相机取像、实时动态显示功能.反光板上目标是三个顶点,如图1 所示.通过定位反光板上三个顶点来确定位置信息.取像完成后,首先对采集的目标区域进行轮廓查找,得到目标区域;再通过最小矩形框定得到目标的精确坐标;然后查找目标顶点;最后引入补偿计算模型,实现位移和角度补偿.以上过程采用C#平台与EmguCV 来实现.本文机制整体框架如图2 所示.图1 反光板Fig.1 Backlight board图2 本文定位与引导机制架构Fig.2 Positioning and visual guiding system architecture in this paper2 基于相机SDK 数据转换的图像采集首先基于相机C#版本SDK 进行二次开发,用C#语言编程调用SDK 底层相机采集函数,取出相机采集的图像裸数据,即二进制数据.然后,利用字节流转换的方法,将图像裸数据转换至C#支持的Bitmap 格式数据.最后利用索引调色板重构方式,转换到Emgucv 数据格式Image <>.由此得到PC-visual stadio 平台可以处理的数据格式,从而通过C#编程实现两个工业相机的数据采集,为图像处理打下数据基础.实时显示视频如图4 所示.通过C#调用SDK,将相机采集的图像裸数据,转换为C#可以识别的数据流,继而转换为Bitmap 格式.由于索引图像格式存在伪彩,本研究采用索引表重构[11],转换Emgucv 平台图像数据格式Image,如图3 所示,为后续图像处理、定位打好数据基础.图3 数据采集与转换流程Fig.3 Data acquisition and conversion process相机初始化部分代码:相机SDK—C#-Emgucv 平台数据转换部分代码:图4 本文双目视觉效果图Fig.4 Effect of double vision in this paper3 基于Emgucv 的顶点目标定位基于阈值分割和轮廓查找得到可能包含目标点区域,再利用Emgucv 的最小矩形框定函数cvMinAreaRect2,得到可能包含目标点的最小外接矩形区域,再通过查找顶点,得到顶点坐标;随后,与标准坐标相减后得到位置偏移和角度旋转.基于式(1)计算,得到X 轴、Y 轴补偿和角度补偿,即测量值与标准值得差值表示位移偏差和角度偏差.整体框架如图5 所示.采用轮廓查找,定位出目标.图5 定位算法Fig.5 The positioning algorithm式(1)中,x、y 为实际坐标,Standard_x、Standard_y 为标准坐标,Delt_X、Delt_Y 为X、Y 轴偏移.Juli 为两顶点距离,Jiaodu 为旋转角度;Real_distance为两点实际距离,Pixel_distance 为两点像素距离,Bili 为图像距离到实际距离的转换比例.以图6 为待定位图像,经本文定位机制处理后,结果见图7.从图7 中可知,本文定位机制精确识别出角点.可见定位标示绿点准确的打在顶点上,代表定位成功.进而计算出水平、垂直、角度补偿,如图8 所示.图8 为软件界面部分截图,是补偿计算显示.图6 原图Fig.6 The original image图7 处理效果图Fig.7 Processing result image图8 补偿计算显示Fig.8 Display of compensation calculation背光板顶点定位部分代码:4 基于视觉引导的机构补偿计算出位移和角度的补偿值后,本文利用PLC 实现位移、角度补偿.视觉软件完成对背光板X 轴、Y 轴位移偏移、旋转角度,即X 轴、Y 轴、角度补偿,软件通过串口通信将这些值传递给PLC 机构,PLC 转换为相应的动作.比如X 轴偏移-4 mm,PLC 步进电机X 轴方向多走4 mm,X 轴偏移4 mm,PLC 步进电机X 轴方向少走4 mm,Y 轴偏移-4 mm,PLC 步进电机Y 轴方向多走4 mm,Y 轴偏移4 mm,PLC 步进电机Y 轴方向少走4 mm,角度偏移-4°,PLC 旋转电机逆时针旋转4°,角度偏移4°,PLC 旋转电机顺时针旋转4°.PLC 即可编程逻辑控制器,它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程.当可编程逻辑控制器投入运行后,其工作过程一般分为三个阶段,即输入采样、用户程序执行和输出刷新三个阶段.完成上述三个阶段称作一个扫描周期.在整个运行期间,可编程逻辑控制器的CPU 以一定的扫描速度重复执行上述三个阶段.部分PLC 关键代码:5 实验与讨论本文定位与引导机制,基于C#、EmguCV 编程完成对目标视野的取像,通过阈值分割、轮廓匹配、最小矩形框定、顶点查找得到目标的精确坐标.经过实验验证,在图像目标特征不明显,准确定位目标位置,如图9~10 所示.传统定位方式是基于静态大差异特征识别定位算法,在图像目标特征不明显,且背景复杂时,往往存在定位不准确,如图11~12 所示.图9 本文算法效果图Fig.9 Algorithm effect in this paper图10 本文算法效果图Fig.10 Algorithm effect in this paper图11 传统算法效果图Fig.11 Effect of the traditional algorithm随后,对十枚背光板进行检测,先用精密光学距离测量工具测算出实际物理偏移;然后分别用传统算法和本文算法测试,计算出偏移,然后综合取平均值后,结果见表1.从表中可知,本文算法的定位精度比传统技术要高,定位偏移非常小;而传统的角点定位技术产生了较大的偏移.图12 传统算法效果图Fig.12 Effect of the traditional algorithm表1 测试数据表Tab.1 Table of data testing名称实际物理偏移传统算法计算偏移本文算法计算偏移X 方向 3.0 2.0 3.00 Y 方向 5.0 1.0 4.90角度2.3 3.1 2.356 结论为了解决反光板顶点目标的定位问题,本文提出了一个基于EmguCV 与双目视觉的定位与引导机制.首先基于两个Basler 工业相机实现图像采集;然后基于轮廓查找与阈值分割处理得到目标的大致区域,再通过最小矩形框定和顶点查找得到目标的精确坐标.最后引入补偿计算机制,实现机构补偿.最后测试了本文机制性能,结果表明:与普通的图像目标定位算法相比,在图像目标特征背景复杂时,本文机制具有更好的定位与引导效果,准确定位出图像目标的坐标,并完成定位.参考文献:[1]王忠勇.一种并联机械手视觉引导算法[J].计算机测量与控制,2013,13(17):4983-4986.[2]李龙.结构光视觉引导的轨迹跟踪系统的标定技术[J].计算机工程与应用,2013,18(11):383-387.[3]赵丹阳.火灾视频图像定位中特征点提取和匹配[J].计算机工程与应用,2013,36(4):181-185.[4]聂华.基于计算机图像定位的伺服平台研究[J].电子设计工程,2013,21(7):1906-1913.[5]李翀伦.复杂背景下红外图像目标的快速定位[J].海军工程大学学报,2013,33(10):2886-2890.[6]秦绪佳,桑贤生,程时伟.改进的规范化卷积图像修复算法[J].计算机辅助设计与图形学学报,2011,23(2):371-376.[7] Noori H,Saryazdi S.A bilateral image inpainting[J].IJST Trans Electr Eng,2011,25(E2):95-108.[9]李虹.基于符号理据性的视觉引导系统设计研究[J].统计与管理,2014,18(15):482-4387.[10] hmann J E,Appas T P,Neuhoff D.Structure texture similarity metrics for image analysis and retrieval[J].IEEE Transactions,2013,22(7):2545-2258.[11]龙水军.基于彩色轨迹引导的AGV 视觉导航方案研究[J].工具技术,2014,18(15):42-47.[12]王秀平.基于激光视觉引导的焊接机器人系统设计[J].煤炭技术,2013,21(7):906-913.。

EmguCV类(CvInvoke_Class) 方法整理

EmguCV类(CvInvoke_Class) 方法整理
Normalize
规范化输入数组
Randn(IInputOutputArray, IInputArray, IInputArray)
用正态分布的随机数填充数组
Randn(IInputOutputArray, MCvScalar, MCvScalar)
用正态分布的随机数填充数组
RandShuffle
将原数组(矩阵)打乱
用于标定立体相机
StereoRectify
计算每个摄像机的旋转矩阵(虚拟地)使两个摄像机图像平面处于相同的平面。
StereoRectifyUncalibrated
在不知道摄像头的固有参数和它们在空间的相对位置计算校正变换
方法
CalibrateCamera(IInputArray, IInputArray, Size, IInputOutputArray, IInputOutputArray, IOutputArray, IOutputArray, CalibType, MCvTermCriteria)
cvGetRawData
以低级别信息填充输出变量。
cvGetRow
返回头文件信息,对应于输入数组的指定行。
cvGetRows
返回头文件信息,对应输入数组的指定行跨度。
cvGetSubRect
返回头文件,对应于输入数组的指定矩形。换句话说,它允许用户将输入阵列的一部分视为独立阵列。通过还可提取ROI的子阵列。
计算源数据的加权平均和,使得acc变为帧序列的运行平均值(Calculates weighted sum of input src and the accumulator acc so that acc becomes a running average of frame sequence: acc(x,y)=(1-alpha) * acc(x,y) + alpha * image(x,y) if mask(x,y)!=0 where alpha regulates update speed (how fastaccumulator forgets about previous frames).

EmguCV图像处理函数

EmguCV图像处理函数

Opencv函数Emgucv函数作用cvLoadImage Cvinvoke.cvLoadImage将图像文件加载至内存cvNamedWindow Cvinvoke.cvNamedWindow在屏幕上创建一个窗口cvShowImage Cvinvoke.cvShowImage在一个已创建好的窗口中显示图像cvWaitKey Cvinvoke.cvWaitKey使程序暂停,等待用户触发一个按键操作cvReleaseImage Cvinvoke.cvReleaseImage释放图像文件所分配的内存cvDestroyWindow Cvinvoke.cvDestroyWindow销毁显示图像文件的窗口cvQueryFrame Cvinvoke.cvQueryFrame用来将下一帧视频文件载入内存cvReleaseCapture Cvinvoke.cvReleaseCapture释放CvCapture结构开辟的内存空间cvCreateTrackbar Cvinvoke.cvCreateTrackbar创建一个滚动条cvSetCaptureProperty Cvinvoke.cvSetCaptureProperty设置CvCapture对象的各种属性cvGetCaptureProperty Cvinvoke.cvGetCaptureProperty查询CvCapture对象的各种属性cvGetSize Cvinvoke.cvGetSize当前图像结构的大小cvSmooth Cvinvoke.cvSmooth对图像进行平滑处理cvPyrDown Cvinvoke.cvPyrDown图像金字塔,降采样,图像缩小为原来四分之一cvCanny:Canny Cvinvoke.cvCanny:Canny边缘检测cvCreateCameraCapture Cvinvoke.cvCreateCameraCapture从摄像设备中读入数据cvCreateVideoWriter Cvinvoke.cvCreateVideoWriter创建一个写入设备以便逐帧将视频流写入视频文件cvWriteFrame Cvinvoke.cvWriteFrame逐帧将视频流写入文件cvReleaseVideoWriter Cvinvoke.cvReleaseVideoWriter释放CvVideoWriter结构开辟的内存空间CV_MAT_ELEM Cvinvoke.CV_MAT_ELEM从矩阵中得到一个元素cvAbs Cvinvoke.cvAbs计算数组中所有元素的绝对值cvAbsDiff Cvinvoke.cvAbsDiff计算两个数组差值的绝对值cvAbsDiffS Cvinvoke.cvAbsDiffS计算数组和标量差值的绝对值cvAdd Cvinvoke.cvAdd两个数组的元素级的加运算cvAddS Cvinvoke.cvAddS一个数组和一个标量的元素级的相加运算cvAddWeighted Cvinvoke.cvAddWeighted两个数组的元素级的加权相加运算(alpha运算) cvAvg Cvinvoke.cvAvg计算数组中所有元素的平均值cvAvgSdv Cvinvoke.cvAvgSdv计算数组中所有元素的绝对值和标准差cvCalcCovarMatrix Cvinvoke.cvCalcCovarMatrix计算一组n维空间向量的协方差cvCmp Cvinvoke.cvCmp对两个数组中的所有元素运用设置的比较操作cvCmpS Cvinvoke.cvCmpS对数组和标量运用设置的比较操作cvConvertScale Cvinvoke.cvConvertScale用可选的缩放值转换数组元素类型cvCopy Cvinvoke.cvCopy把数组中的值复制到另一个数组中cvCountNonZero Cvinvoke.cvCountNonZero计算数组中非0值的个数cvCrossProduct Cvinvoke.cvCrossProduct计算两个三维向量的向量积(叉积) cvCvtColor Cvinvoke.cvCvtColor将数组的通道从一个颜色空间转换另外一个颜色空间cvDet Cvinvoke.cvDet计算方阵的行列式cvDiv Cvinvoke.cvDiv用另外一个数组对一个数组进行元素级的除法运算cvDotProduct Cvinvoke.cvDotProduct计算两个向量的点积cvEigenVV Cvinvoke.cvEigenVV计算方阵的特征值和特征向量cvFlip Cvinvoke.cvFlip围绕选定轴翻转cvGEMM Cvinvoke.cvGEMM矩阵乘法cvGetCol Cvinvoke.cvGetCol从一个数组的列中复制元素cvGetCols Cvinvoke.cvGetCols从数据的相邻的多列中复制元素cvGetDiag Cvinvoke.cvGetDiag复制数组中对角线上的所有元素cvGetDims Cvinvoke.cvGetDims返回数组的维数cvGetDimSize Cvinvoke.cvGetDimSize返回一个数组的所有维的大小cvGetRow Cvinvoke.cvGetRow从一个数组的行中复制元素值cvGetRows Cvinvoke.cvGetRows从一个数组的多个相邻的行中复制元素值cvGetSize Cvinvoke.cvGetSize得到二维的数组的尺寸,以CvSize返回cvGetSubRect Cvinvoke.cvGetSubRect从一个数组的子区域复制元素值cvInRange Cvinvoke.cvInRange检查一个数组的元素是否在另外两个数组中的值的范围内cvInRangeS Cvinvoke.cvInRangeS检查一个数组的元素的值是否在另外两个标量的范围内cvInvert Cvinvoke.cvInvert求矩阵的逆cvMahalonobis Cvinvoke.cvMahalonobis计算两个向量间的马氏距离cvMax Cvinvoke.cvMax在两个数组中进行元素级的取最大值操作cvMaxS Cvinvoke.cvMaxS在一个数组和一个标量中进行元素级的取最大值操作cvMerge Cvinvoke.cvMerge把几个单通道图像合并为一个多通道图像cvMin Cvinvoke.cvMin在两个数组中进行元素级的取最小值操作cvMinS Cvinvoke.cvMinS在一个数组和一个标量中进行元素级的取最小值操作cvMinMaxLoc Cvinvoke.cvMinMaxLoc寻找数组中的最大最小值cvMul Cvinvoke.cvMul计算两个数组的元素级的乘积(点乘)cvNot Cvinvoke.cvNot按位对数组中的每一个元素求反cvNormalize Cvinvoke.cvNormalize将数组中元素进行归一化cvOr Cvinvoke.cvOr对两个数组进行按位或操作cvOrs Cvinvoke.cvOrs在数组与标量之间进行按位或操作cvReduce Cvinvoke.cvReduce通过给定的操作符将二维数组简为向量cvRepeat Cvinvoke.cvRepeat以平铺的方式进行数组复制cvSet Cvinvoke.cvSet用给定值初始化数组cvSetZero Cvinvoke.cvSetZero将数组中所有元素初始化为0 cvSetIdentity Cvinvoke.cvSetIdentity将数组中对角线上的元素设为1,其他置0 cvSolve Cvinvoke.cvSolve求出线性方程组的解cvSplit Cvinvoke.cvSplit将多通道数组分割成多个单通道数组cvSub Cvinvoke.cvSub两个数组元素级的相减cvSubS Cvinvoke.cvSubS元素级的从数组中减去标量cvSubRS Cvinvoke.cvSubRS元素级的从标量中减去数组cvSum Cvinvoke.cvSum对数组中的所有元素求和cvSVD Cvinvoke.cvSVD二维矩阵的奇异值分解cvSVBkSb Cvinvoke.cvSVBkSb奇异值回代计算cvTrace Cvinvoke.cvTrace计算矩阵迹cvTranspose Cvinvoke.cvTranspose矩阵的转置运算cvXor Cvinvoke.cvXor对两个数组进行按位异或操作cvXorS Cvinvoke.cvXorS在数组和标量之间进行按位异或操作cvZero Cvinvoke.cvZero将所有数组中的元素置为0cvConvertScaleAbs Cvinvoke.cvConvertScaleAbs计算可选的缩放值的绝对值之后再转换数组元素的类型cvNorm Cvinvoke.cvNorm计算数组的绝对范数,绝对差分范数或者相对差分范数cvAnd Cvinvoke.cvAnd对两个数组进行按位与操作cvAndS Cvinvoke.cvAndS在数组和标量之间进行按位与操作cvScale是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数cvT cvT是函数cvTranspose的缩写cvLine Cvinvoke.cvLine画直线cvRectangle Cvinvoke.cvRectangle画矩形cvCircle Cvinvoke.cvCircle画圆cvEllipse Cvinvoke.cvEllipse画椭圆cvEllipseBox Cvinvoke.cvEllipseBox使用外接矩形描述椭圆cvFillPolycvFillConvexPolycvPolyLine cvFillPolycvFillConvexPolycvPolyLine画多边形cvPutText Cvinvoke.Cvinvoke.cvPutText在图像上输出一些文本cvInitFont Cvinvoke.Cvinvoke.cvInitFont采用一组参数配置一些用于屏幕输出的基本个特定字体cvSave Cvinvoke.Cvinvoke.cvSave矩阵保存cvLoad Cvinvoke.Cvinvoke.cvLoad矩阵读取cvOpenFileStorage Cvinvoke.Cvinvoke.cvOpenFileStorage为读/写打开存储文件cvReleaseFileStorage Cvinvoke.Cvinvoke.cvReleaseFileStorage释放存储的数据cvStartWriteStruct Cvinvoke.Cvinvoke.cvStartWriteStruct开始写入新的数据结构cvEndWriteStruct Cvinvoke.cvEndWriteStruct结束写入数据结构cvWriteInt Cvinvoke.cvWriteInt写入整数型cvWriteReal Cvinvoke.cvWriteReal写入浮点型cvWriteString Cvinvoke.cvWriteString写入字符型cvWriteComment Cvinvoke.cvWriteComment写一个XML或YAML的注释字串cvWrite Cvinvoke.cvWrite写一个对象cvWriteRawData Cvinvoke.cvWriteRawData写入多个数值cvWriteFileNode Cvinvoke.cvWriteFileNode将文件节点写入另一个文件存储器cvGetRootFileNode Cvinvoke.cvGetRootFileNode获取存储器最顶层的节点cvGetFileNodeByName Cvinvoke.cvGetFileNodeByName在映图或存储器中找到相应节点cvGetHashedKey Cvinvoke.cvGetHashedKey为名称返回一个惟一的指针cvGetFileNode Cvinvoke.cvGetFileNode在映图或文件存储器中找到节点cvGetFileNodeName Cvinvoke.cvGetFileNodeName返回文件的节点名cvReadInt Cvinvoke.cvReadInt读取一个无名称的整数型cvReadIntByName Cvinvoke.cvReadIntByName读取一个有名称的整数型cvReadReal Cvinvoke.cvReadReal读取一个无名称的浮点型cvReadRealByName Cvinvoke.cvReadRealByName读取一个有名称的浮点型cvReadString Cvinvoke.cvReadString从文件节点中寻找字符串cvReadStringByName Cvinvoke.cvReadStringByName找到一个有名称的文件节点并返回它cvRead Cvinvoke.cvRead将对象解码并返回它的指针cvReadByName Cvinvoke.cvReadByName找到对象并解码cvReadRawData Cvinvoke.cvReadRawData读取多个数值cvStartReadRawData Cvinvoke.cvStartReadRawData初始化文件节点序列的读取cvReadRawDataSlice Cvinvoke.cvReadRawDataSlice读取文件节点的内容cvGetModuleInfo Cvinvoke.cvGetModuleInfo检查IPP库是否已经正常安装并且检验运行是否正常cvResizeWindow Cvinvoke.cvResizeWindow用来调整窗口的大小cvSaveImage Cvinvoke.cvSaveImage保存图像cvMoveWindow Cvinvoke.cvMoveWindow将窗口移动到其左上角为x,y的位置cvDestroyAllWindow Cvinvoke.cvDestroyAllWindow用来关闭所有窗口并释放窗口相关的内存空间cvGetTrackbarPos Cvinvoke.cvGetTrackbarPos读取滑动条的值cvSetTrackbarPos Cvinvoke.cvSetTrackbarPos设置滑动条的值cvGrabFrame Cvinvoke.cvGrabFrame用于快速将视频帧读入内存cvRetrieveFrame Cvinvoke.cvRetrieveFrame对读入帧做所有必须的处理cvConvertImage Cvinvoke.cvConvertImage用于在常用的不同图像格式之间转换cvErode Cvinvoke.cvErode形态腐蚀cvDilate Cvinvoke.cvDilate形态学膨胀cvMorphologyEx Cvinvoke.cvMorphologyEx更通用的形态学函数cvFloodFill Cvinvoke.cvFloodFill漫水填充算法,用来进一步控制哪些区域将被填充颜色cvResize Cvinvoke.cvResize放大或缩小图像cvPyrUp Cvinvoke.cvPyrUp图像金字塔,将现有的图像在每个维度上都放大两倍cvPyrSegmentation Cvinvoke.cvPyrSegmentation利用金字塔实现图像分割cvThreshold Cvinvoke.cvThreshold图像阈值化cvAcc Cvinvoke.cvAcc可以将8位整数类型图像累加为浮点图像cvAdaptiveThreshold Cvinvoke.cvAdaptiveThreshold图像自适应阈值cvFilter2D Cvinvoke.cvFilter2D图像卷积cvCopyMakeBorder Cvinvoke.cvCopyMakeBorder将特定的图像轻微变大,然后以各种方式自动填充图像边界cvSobel Cvinvoke.cvSobel图像边缘检测,Sobel算子cvLaplace Cvinvoke.cvLaplace拉普拉斯变换图像边缘检测cvHoughLines2Cvinvoke.cvHoughLines2霍夫直线变换cvHoughCircles Cvinvoke.cvHoughCircles霍夫圆变换cvRemap Cvinvoke.cvRemap图像重映射,校正标定图像,图像插值cvWarpAffine Cvinvoke.cvWarpAffine稠密仿射变换cvGetQuadrangleSubPix Cvinvoke.cvGetQuadrangleSubPix仿射变换cvGetAffineTransform Cvinvoke.cvGetAffineTransform仿射映射矩阵的计算cvCloneImage Cvinvoke.cvCloneImage将整个IplImage结构复制到新的IplImage中cv2DRotationMatrix Cvinvoke.cv2DRotationMatrix仿射映射矩阵的计算cvTransform Cvinvoke.cvTransform稀疏仿射变换cvWarpPerspective Cvinvoke.cvWarpPerspective密集透视变换(单应性) cvGetPerspectiveTransform Cvinvoke.cvGetPerspectiveTransform计算透视映射矩阵cvPerspectiveTransform Cvinvoke.cvPerspectiveTransform稀疏透视变换cvCartToPolar Cvinvoke.cvCartToPolar将数值从笛卡尔空间到极坐标(极性空间)进行映射cvPolarToCart Cvinvoke.cvPolarToCart将数值从极性空间到笛卡尔空间进行映射cvLogPolar Cvinvoke.cvLogPolar对数极坐标变换cvDFT Cvinvoke.cvDFT离散傅里叶变换cvMulSpectrums Cvinvoke.cvMulSpectrums频谱乘法cvDCT Cvinvoke.cvDCT离散余弦变换cvIntegral Cvinvoke.cvIntegral计算积分图像cvDistTransform Cvinvoke.cvDistTransform图像的距离变换cvEqualizeHist Cvinvoke.cvEqualizeHist直方图均衡化cvCreateHist Cvinvoke.cvCreateHist创建一新直方图cvMakeHistHeaderForArray Cvinvoke.cvMakeHistHeaderForArray根据已给出的数据创建直方图cvNormalizeHist Cvinvoke.cvNormalizeHist归一化直方图cvThreshHist Cvinvoke.cvThreshHist直方图阈值函数cvCalcHist Cvinvoke.cvCalcHist从图像中自动计算直方图cvCompareHist Cvinvoke.cvCompareHist用于对比两个直方图的相似度cvCalcEMD2Cvinvoke.cvCalcEMD2陆地移动距离(EMD)算法cvCalcBackProject Cvinvoke.cvCalcBackProject反向投影cvCalcBackProjectPatch Cvinvoke.cvCalcBackProjectPatch图块的方向投影cvMatchTemplate Cvinvoke.cvMatchTemplate模板匹配cvCreateMemStorage Cvinvoke.cvCreateMemStorage用于创建一个内存存储器cvCreateSeq Cvinvoke.cvCreateSeq创建序列cvSeqInvert Cvinvoke.cvSeqInvert将序列进行逆序操作cvCvtSeqToArray Cvinvoke.cvCvtSeqToArray复制序列的全部或部分到一个连续内存数组中cvFindContours Cvinvoke.cvFindContours从二值图像中寻找轮廓cvDrawContours Cvinvoke.cvDrawContours绘制轮廓cvApproxPoly Cvinvoke.cvApproxPoly使用多边形逼近一个轮廓cvContourPerimeter Cvinvoke.cvContourPerimeter轮廓长度cvContoursMoments Cvinvoke.cvContoursMoments计算轮廓矩cvMoments Cvinvoke.cvMoments计算Hu不变矩cvMatchShapes Cvinvoke.cvMatchShapes使用矩进行匹配cvInitLineIterator Cvinvoke.cvInitLineIterator对任意直线上的像素进行采样cvSampleLine Cvinvoke.cvSampleLine对直线采样cvAbsDiff Cvinvoke.cvAbsDiff帧差cvWatershed Cvinvoke.cvWatershed分水岭算法cvInpaint Cvinvoke.cvInpaint修补图像cvGoodFeaturesToTrack Cvinvoke.cvGoodFeaturesToTrack寻找角点cvFindCornerSubPix Cvinvoke.cvFindCornerSubPix用于发现亚像素精度的角点位置cvCalcOpticalFlowLK Cvinvoke.cvCalcOpticalFlowLK实现非金字塔的Lucas-Kanade稠密光流算法cvMeanShift Cvinvoke.cvMeanShift mean-shift跟踪算法cvCamShift Cvinvoke.cvCamShift camshift跟踪算法cvCreateKalman Cvinvoke.cvCreateKalman创建Kalman滤波器cvCreateConDensation Cvinvoke.cvCreateConDensation创建condensation滤波器cvConvertPointsHomogenious Cvinvoke.cvConvertPointsHomogenious对齐次坐标进行转换cvFindChessboardCorners Cvinvoke.cvFindChessboardCorners定位棋盘角点cvFindHomography Cvinvoke.cvFindHomography计算单应性矩阵cvRodrigues2Cvinvoke.cvRodrigues2罗德里格斯变换cvFitLine Cvinvoke.cvFitLine直线拟合算法cvCalcCovarMatrix:Cvinvoke.cvCalcCovarMatrix:计算协方差矩阵cvInvert Cvinvoke.cvInvert计算协方差矩阵的逆矩阵cvMahalanobis Cvinvoke.cvMahalanobis计算Mahalanobis距离cvKMeans2Cvinvoke.cvKMeans2K均值cvCloneMat Cvinvoke.cvCloneMat根据一个已有的矩阵创建一个新矩阵cvPreCornerDetect Cvinvoke.cvPreCornerDetect计算用于角点检测的特征图cvGetImage Cvinvoke.cvGetImage CvMat图像数据格式转换成IplImage图像数据格式cvMatMul Cvinvoke.cvMatMul两矩阵相乘。

emgucv例子

emgucv例子

emgucv例子
Emgu CV(也称为Emgu Computer Vision)是一个基于OpenCV
库的跨平台计算机视觉库,它提供了用于图像处理、对象检测、人
脸识别、视频分析等功能的丰富工具和类库。

下面我将从多个角度
来介绍Emgu CV的例子。

首先,Emgu CV提供了丰富的图像处理功能,包括图像滤波、
边缘检测、图像变换等。

例如,你可以使用Emgu CV来实现图像的
模糊处理、边缘检测以及图像的缩放和旋转等操作。

这些功能可以
帮助你处理图像数据,提取特征并进行后续的分析和识别。

其次,Emgu CV还支持对象检测和识别。

你可以利用Emgu CV
提供的算法和工具来实现目标检测、物体跟踪以及形状识别等功能。

例如,你可以使用Emgu CV来开发一个人脸识别系统,检测视频中
的人脸并进行识别和跟踪。

此外,Emgu CV还提供了丰富的视频处理功能。

你可以利用Emgu CV来实现视频的读取、处理和分析,包括视频流的捕获、帧
处理、运动检测等。

这些功能可以帮助你开发视频监控系统、视频
分析系统以及视频内容识别等应用。

总之,Emgu CV提供了丰富的计算机视觉功能和工具,可以帮助开发者快速实现图像处理、对象检测、人脸识别、视频分析等功能。

通过使用Emgu CV,开发者可以更加高效地开发和部署计算机视觉应用,实现图像和视频数据的分析和识别。

希望这些例子可以帮助你更好地了解Emgu CV的功能和应用。

emgu分水岭算法计数

emgu分水岭算法计数

emgu分水岭算法计数摘要:一、分水岭算法简介1.分水岭算法的概念2.分水岭算法的应用场景二、emgu分水岭算法实现1.emgu库简介2.emgu分水岭算法原理3.emgu分水岭算法步骤三、emgu分水岭算法计数1.计数原理2.计数方法3.计数结果分析四、案例演示1.图像处理实例2.结果分析正文:【一、分水岭算法简介】分水岭算法(Watershed algorithm)是一种图像处理领域中的边缘检测和分割技术。

它的基本思想是寻找图像中像素之间的极值点,将这些极值点作为分水岭,将图像划分为不同的区域。

这种算法具有较好的适应性和稳定性,可以有效处理复杂场景下的图像分割问题。

【二、emgu分水岭算法实现】emgu(Emgu CV)是一个基于OpenCV的.NET库,提供了丰富的图像处理功能。

emgu分水岭算法实现了分水岭原理,并对算法进行了优化。

以下是emgu分水岭算法的基本步骤:1.对输入图像进行预处理,如滤波、去噪等。

2.计算图像的梯度幅值和方向。

3.寻找梯度幅值的最大值点和最小值点。

4.将最大值点和最小值点连接成边缘。

5.对边缘进行填充,得到分割后的图像。

【三、emgu分水岭算法计数】emgu分水岭算法计数是对分割后的图像中边缘像素进行统计的过程。

计数原理是根据边缘像素的颜色、纹理等特征,将其分为不同的类别。

以下是一种简单的计数方法:1.预处理:对分割后的图像进行去噪、平滑等操作,以消除边缘附近的噪声。

2.特征提取:从处理后的图像中提取边缘像素的特征,如颜色、纹理等。

3.分类:根据特征将边缘像素分为不同的类别。

可以使用机器学习方法(如SVM、神经网络等)进行分类。

4.计数:统计各个类别边缘像素的数量,得到最终的结果。

【四、案例演示】以下是一个使用emgu分水岭算法进行图像处理的实例:1.输入图像:一幅包含建筑物、道路、树木等元素的复杂场景图像。

2.使用emgu分水岭算法进行分割。

3.观察分割结果:可以发现,建筑物、道路和树木等元素得到了较好的分割。

EmguCV常用函数总结

EmguCV常用函数总结

EmguCV常⽤函数总结1 Emgucv常⽤函数总结:2读取图⽚3 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor);4//根据路径创建指定的灰度图⽚5 Mat scr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.Grayscale);6获取灰度//图像类型转换, bgr 转成 gray 类型。

MAT Bw = New MAT7 CvInvoke.CvtColor(SCr, bw, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);8//相当于⼆值化图 --⿊⽩根据⼤⼩10判断为0还是2559 CvInvoke.Threshold(bw,bw,10,255,Emgu.CV.CvEnum.ThresholdType.BinaryInv);10//获取指定区域图⽚ SCr为mat类型11 Rectangle rectangle = new Rectangle(10,10,10,10);12 SCr = SCr.ToImage<Bgr, byte>().GetSubRect(rectangle).Mat;13//将Mat类型转换为Image类型14 Image<Bgr, byte> Su = SCr.ToImage<Bgr, byte>();15 Image<Bgr, byte> Img = new Image<Bgr, byte>(new Bitmap(""));//路径声明16 Image<Bgr, byte> Sub = SCr.ToImage<Bgr, byte>().GetSubRect(rectangle);//指定范围17//指定参数获得结构元素18 Mat Struct_element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Cross, new Size(3, 3), new Point(-1, -1));19//膨胀20 CvInvoke.Dilate(bw, bw, Struct_element, new Point(1,1),3,Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));21//腐蚀当Struct_element模型创建不合理或者膨胀腐蚀次数较⼤时可能图像会发⽣偏移22 CvInvoke.Erode(bw, bw, Struct_element, new Point(-1, -1), 3,Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));23//轮廓提取24 VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();25//筛选后26 CvInvoke.FindContours(bw, contours, null, Emgu.CV.CvEnum.RetrType.List, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);27int ksize = contours.Size;//获取连通区域的个数。

EmguCV入门指南-中文翻译版 (1)

EmguCV入门指南-中文翻译版 (1)

CvPoint2D32f
System.Drawing.Size
CvSize
System.Drawing.Recta ngle
CvRect
枚举常量映射 Emgu.CV.CvEnum
函数映射 – EMGU.CV.CVINVOKE ..................................................................................................... 2 结构映射 EMGU.CV.STRUCTURE.MXXX.............................................................................................2 枚举常量映射 EMGU.CV.CVENUM ................................................................................................. 2
MATRICES 如何使用........................................................................................................................6 深度作为泛型参数 .................................................................................................................. 6 矩阵深度 .................................................................................................................................. 6 XML 序列化 ..............................................................................................................................7

emgu cv 自动对焦算法

emgu cv 自动对焦算法

emgu cv 自动对焦算法在 Emgu CV 中,实现自动对焦算法需要一些步骤。

Emgu CV 是一个开源的计算机视觉库,它封装了 OpenCV 的接口,可以在 .NET 环境中使用。

以下是一个简单的自动对焦算法的实现步骤:1. 获取图像:首先,你需要获取一张图像。

这可以通过使用 Emgu CV 的 `` 方法来完成。

```csharpImage<Bgr, byte> image = new Image<Bgr, byte>("");```2. 创建初始焦点图:然后,创建一个焦点图(Focus Map),这是图像中所有像素点的值集合,可以用于测量每个像素的清晰度。

```csharpImage<Gray, float> focusMap = new Image<Gray, float>(, );```3. 计算焦点图:计算焦点图的方法有很多种,一种常见的方法是使用图像的梯度。

Emgu CV 提供了 `Canny` 边缘检测器和 `Sobel` 边缘检测器来计算图像的梯度。

```csharpImage<Gray, float> gradientX = new Image<Gray, float>(, );Image<Gray, float> gradientY = new Image<Gray, float>(, ); (image, gradientX, 1, 0, 3);(image, gradientY, 0, 1, 3);Image<Gray, float> gradientMagnitude = new Image<Gray, float>(, ); (gradientX, gradientY, gradientMagnitude);// 在这里你可以调整参数以获得更好的焦点图,例如应用阈值、滤波等操作。

自己积累的一些EmguCV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

自己积累的一些EmguCV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

⾃⼰积累的⼀些EmguCV代码(主要有图⽚格式转换,图⽚裁剪,图⽚翻转,图⽚旋转和图⽚平移等功能)using System;using System.Drawing;using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;namespace ZNLGIS{public class ImageClass{//图⽚裁剪public static Image<Bgr, Byte> Cut(Image<Bgr,Byte> image ,Rectangle rectangle){System.Drawing.Size roisize = new Size(260,380);IntPtr dst = CvInvoke.cvCreateImage(roisize, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);CvInvoke.cvSetImageROI(image.Ptr, rectangle);CvInvoke.cvCopy(image.Ptr, dst, IntPtr.Zero);return OpenCVEmguCVDotNet.IplImagePointerToEmgucvImage<Bgr, Byte>(dst);}//图⽚裁剪public static Image<Bgr, Byte> Cut2(Image<Bgr,Byte> image,int oldwidth,int oldheight){int x = image.Width - oldwidth;int y = image.Height - oldheight;System.Drawing.Size roisize = new System.Drawing.Size(oldwidth, oldheight); //要裁剪的图⽚⼤⼩IntPtr dst = CvInvoke.cvCreateImage(roisize, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);System.Drawing.Rectangle rect = new System.Drawing.Rectangle(x/2, y/2, oldwidth, oldheight);CvInvoke.cvSetImageROI(image.Ptr, rect);CvInvoke.cvCopy(image.Ptr, dst, IntPtr.Zero);return OpenCVEmguCVDotNet.IplImagePointerToEmgucvImage<Bgr, Byte>(dst);}//图⽚翻转public static Image<Bgr, Byte> FlipImage(Image<Bgr, Byte> image, bool isHorizontal){if (isHorizontal){CvInvoke.cvFlip(image.Ptr, IntPtr.Zero, FLIP.HORIZONTAL);}else{CvInvoke.cvFlip(image.Ptr, IntPtr.Zero, FLIP.VERTICAL);}return image;}//图⽚旋转public static Image<Bgr, Byte> RotateImage(Image<Bgr, Byte> image_old, double angle, bool clockwise){IntPtr image_temp;double anglerad = Math.PI * (angle / 180);int newwidth = (int)Math.Abs(image_old.Bitmap.Height * Math.Sin(anglerad)) +(int)Math.Abs(image_old.Bitmap.Width * Math.Cos(anglerad)) + 1;int newheight = (int)Math.Abs(image_old.Bitmap.Height * Math.Cos(anglerad)) +(int)Math.Abs(image_old.Bitmap.Width * Math.Sin(anglerad)) + 1;image_temp = CvInvoke.cvCreateImage(new Size(newwidth, newheight), IPL_DEPTH.IPL_DEPTH_8U, 3);CvInvoke.cvZero(image_temp);int flag = -1;if (clockwise){flag = 1;}float[] m = new float[6];int w = image_old.Bitmap.Width;int h = image_old.Bitmap.Height;m[0] = (float)Math.Cos(flag * angle * Math.PI / 180);m[1] = (float)Math.Sin(flag * angle * Math.PI / 180);m[3] = -m[1];m[4] = m[0];m[2] = w * 0.5f;unsafe{void* p;IntPtr ptr;fixed (float* pc = m){p = (void*)pc;ptr = new IntPtr(p);}IntPtr M = CvInvoke.cvMat(2, 3, MAT_DEPTH.CV_32F, ptr);CvInvoke.cvGetQuadrangleSubPix(image_old.Ptr,image_temp,M);}return OpenCVEmguCVDotNet.IplImagePointerToEmgucvImage<Bgr, Byte>(image_temp);}//图⽚平移public static Image<Bgr, Byte> Py(Image<Bgr, Byte> src,int x,int y){System.Drawing.Size roisize = new Size(src.Width, src.Height);Image<Bgr, Byte> dst = new Image<Bgr, byte>(src.Width, src.Height, new Bgr(Color.Transparent));int i, j;int w = src.Width;int h = src.Height;if (x >= 0 && y >= 0){for (i = 0; i < w - x; i++){for (j = 0; j < h - y; j++){CvInvoke.cvSet2D(dst, j + y, i + x, CvInvoke.cvGet2D(src, j, i));}}}else if (x >= 0 && y < 0){for (i = 0; i < w - x; i++){for (j = -y; j < h; j++){CvInvoke.cvSet2D(dst, j + y, i + x, CvInvoke.cvGet2D(src, j, i));}}}else if (x < 0 && y >= 0){for (i = -x; i < w; i++){for (j = 0; j < h - y; j++){CvInvoke.cvSet2D(dst, j + y, i + x, CvInvoke.cvGet2D(src, j, i));}}}else{for (i = -x; i < w; i++){for (j = -y; j < h; j++){CvInvoke.cvSet2D(dst, j + y, i + x, CvInvoke.cvGet2D(src, j, i));}}}return OpenCVEmguCVDotNet.IplImagePointerToEmgucvImage<Bgr, Byte>(dst);}}}using System;using System.Drawing;using System.Drawing.Imaging;using System.Runtime.InteropServices;using Emgu.CV;using Emgu.CV.CvEnum;namespace ZNLGIS{public class OpenCVEmguCVDotNet{/// <summary>/// 将MIplImage结构转换到IplImage指针;/// 注意:指针在使⽤完之后必须⽤Marshal.FreeHGlobal⽅法释放。

使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

使⽤C#+EmguCV处理图像⼊门(图像读取_显⽰_保存)⼆上个随笔已经介绍EmguCV的⼀些常⽤库和程序安装以及环境变量的配置,这次写的是如何使⽤这个类库对图像进⾏操作。

EmguCV图像处理系统组成(个⼈见解):图像的基本操作:贴个代码:using Emgu.CV; //使⽤命名空间using Emgu.CV.Structure;using Emgu.CV.CvEnum;using Emgu.Util;static void Main(string[] args){Mat srcImg = CvInvoke.Imread("1.jpg"); //读取图⽚dWindow("img", NamedWindowType.AutoSize); //创建窗⼝CvInvoke.Imshow("img", srcImg); //显⽰图⽚CvInvoke.Imwrite("1.bmp", srcImg); //保存结果图⽚CvInvoke.WaitKey(0); //暂停按键等待}函数解析:①命名空间(必须的):using Emgu.CV ---封装了OpenCV基本图像处理函数,在CvInvoke类中using Emgu.CV.CvEnum ---OpenCV枚举类型,包含⼀些枚举类型宏定义②Imread()函数:1)第⼀个参数,需要填⼊图⽚路径名,⽀持如下格式:Windows位图: *.bmp, *.dibJPEG⽂件: *.jpeg, *.jpg, *.jpeJPEG2000⽂件: *.jp2PNG图⽚: *.png便携⽂件格式: *.pbm, *.pgm, *.ppmSun rasters光栅⽂件: *.sr, *.rasTIFF⽂件: *.tiff, *.tif2)第⼆个参数,指定加载图像的颜⾊类型,默认为ImreadModes.Color=1:③NamedWindow()函数:1)第⼀个参数,设置作为标识的窗⼝名称2)第⼆个参数,窗⼝显⽰⽅式,取值如下:Normal:正常⼤⼩显⽰,⽤户可以改变窗⼝⼤⼩Autosize: 根据图像⼤⼩⾃动调整,⽤户不能⼿动改变窗⼝⼤⼩Opengl: ⽀持openGL④Imshow()函数:1)第⼀个参数,设置需要显⽰的窗⼝名称2)第⼆个参数,填写需要显⽰的图像注:函数中出现InputArray/ OutputArray可先当做Mat类型⑤Imwrite()函数:1)第⼀个参数,设置保存的⽂件名,需填写后缀,如"1.bmp"2)第⼆个参数,要保存的Mat类型图像数据3)第三个参数,表⽰特定格式保存的参数编码,⼀般采⽤默认值不填写⑥WaitKey()函数:1)第⼀个参数,如果delay>0, 表⽰等待delay毫秒之后结束如果delay=0, 表⽰⽆限等待,直到有按键按下结束2)返回值为对应按下按键的ASCII码值,如Esc的ASCII码为27介绍⼀下ASCll表:还有⼀些常⽤的⽅法:1).IsEmpty 判断图像是否为空2).Rows 获取图像⾏数(⾼度)3).Cols 获取图像列数(长度)4).NumberOfChannels 获取图像通道数5).Depth 获取图像位深度。

【Emgu】一起学EmguCV(一)配置与使用

【Emgu】一起学EmguCV(一)配置与使用

【Emgu】⼀起学EmguCV(⼀)配置与使⽤ ⾸先先介绍⼀下OpenCV,OpenCV的全称是:Open Source Computer Vision Library,OpenCV是⼀个基于(开源)发⾏的跨平台计算机视觉库,可以运⾏在Linux、Windows和Mac OS操作系统上。

它轻量级⽽且⾼效——由⼀系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语⾔的接⼝,实现了和计算机视觉⽅⾯的很多通⽤算法。

OpenCV 拥有包括 300 多个C函数的跨平台的中、⾼层 API。

它不依赖于其它的外部库——尽管也可以使⽤某些外部库。

OpenCV中⽂学习站点 EmguCV是OpenCV的⼀个跨平台的.Net封装,由于OpenCV是⽤C和C++编写的,Emgu⽤C#对其进⾏封装,允许⽤.Net语⾔来调⽤OpenCV函数,如C#、VB、VC++等,同时该封装也可以被编译到Mono平台和允许在Windows、Mac OS、Android、iPhone、iPad等多个平台上运⾏特性: Image class with Generic Color and Depth Automatic garbage collection(⾃动垃圾回收) Xml Serializable Image(⽤于⽹络) Image class / Direct invoke function from OpenCV(直接对OpenCV函数的invoke操作) Generic operations on image pixel(对像素操作)接下来看看EmguCV的使⽤1、到Emgu官⽅下载Emgu库 下载地址: 这⾥使⽤的是 libemgucv-windows-universal-gpu-2.4.9.1847.exe (228.6 MB)2、解压或安装完后得到下⾯⽂件 先安装 vcredist_x86 (如果需要开发的是64位的程序,择安装x64版本,我是两个都装)3、进⼊bin/x86⽂件夹 图中框出来的是运⾏时所需要的依赖⽂件,在开发时,需要把这些⽂件复制到程序的Debug⽂件夹内,不然会抛出TypeInitializerException 异常4、有关Emgu相关的类都在bin⽂件夹⾥⾯5、下⾯演⽰⼀下Hello World程序 新建⼀个⼯程,引⽤两个库 引⽤命名控件,记得还要把上⾯框出来的OpenCV依赖⽂件复制到Debug⽬录下using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure; 添加⼀个按钮,⼀个PictureBox控件private void button1_Click(object sender, EventArgs e){Image<Bgr, byte> img = new Image<Bgr, byte>(480, 320, new Bgr(0, 255, 0));MCvFont f = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 1.0, 1.0);img.Draw("hello world", ref f, new Point(10, 80), new Bgr(0, 0, 0));pictureBox1.Image = img.ToBitmap();}。

emgucv 小波变换去噪

emgucv 小波变换去噪

emgucv 小波变换去噪
EmguCV是一个基于OpenCV的.NET包装器,它提供了许多计算
机视觉和图像处理功能。

而小波变换是一种信号处理技术,常用于
去噪和特征提取。

结合EmguCV和小波变换可以实现图像去噪的功能。

首先,使用EmguCV加载图像并将其转换为灰度图像。

然后,可
以使用小波变换对灰度图像进行去噪处理。

小波变换可以将图像分
解为不同尺度的细节和近似部分,通过去除细节部分中的噪声来实
现去噪效果。

在EmguCV中,可以使用小波变换函数(如cv2.dwt)来对图像
进行小波变换,然后根据需要去除细节部分中的噪声。

常见的小波
去噪方法包括阈值处理和软硬阈值处理。

阈值处理可以通过设定阈
值来去除小于阈值的细节部分,软硬阈值处理则是在阈值处理的基
础上加入了平滑处理,可以更好地保留图像的细节信息。

另外,还可以使用小波变换的逆变换将处理后的图像恢复到原
始图像空间。

在实现小波去噪时,需要根据具体的应用场景和要求
来选择合适的小波基函数、阈值处理方法以及阈值的设定。

总之,结合EmguCV和小波变换可以实现图像的去噪处理,通过合理选择小波基函数和阈值处理方法,可以有效地去除图像中的噪声,保留图像的细节信息,从而得到清晰的图像结果。

希望这些信息能够帮助到你。

Emgu.CV.CvInvoke的类型初始值设定项引发异常解决办法

Emgu.CV.CvInvoke的类型初始值设定项引发异常解决办法

"Emgu.CV.CvInvoke”的类型初始值设定项引发异常--解决办法
网上搜索到以下方法,不能根本解决问题:
第一步,首先引入包,引入所有Emgu开头的包(如Emgu.CV、Emgu.CV.UI、Emgu.CV.ML、Emgu.CV.GPU、Emgu.Util、Emgu.CV.DebuggerVisualizers.VS2010等);
第二步,打开项目目录下的\bin\Debug文件夹,然后把Emgu的\bin目录下(例如我的安路径D:\Emgu\emgucv-windows-x86 2.2.1.1150\bin)的所有的dll文件复制到项目目录下的\bin\Debug文件夹(复制和替换)。

这样就可以了,应该不会产生什么问题了。

其实根本原因是没有配置好系统环境变量,vs找不到需要的文件在哪里。

只要配置好系统环境变量就能彻底解决问题。

把emgucv安装目录的bin\X64或是bin\x86文件夹的地址添加到系统环境变量中就可以了。

emgucv yolov8 例子

emgucv yolov8 例子

1. 概述随着计算机视觉技术的不断发展,图像识别和目标检测算法已经成为了研究的热点之一。

EmguCV是一个基于OpenCV的跨评台计算机视觉库,而YOLOv8则是一种快速、高效的目标检测算法。

本文将以EmguCV和YOLOv8为例,介绍它们的基本原理、应用场景和性能特点。

2. EmguCV的概述EmguCV是一个基于OpenCV的跨评台计算机视觉库,它提供了一系列用于图像处理和计算机视觉的函数和工具。

EmguCV可以在C#、、C++/CLI等不同的语言环境下使用,使得开发人员能够轻松地利用OpenCV的功能来进行图像处理和计算机视觉领域的研究和应用开发。

EmguCV的主要功能包括图像处理、特征提取、图像分割、目标检测等,可以广泛应用于智能监控、医学影像分析、自动驾驶等领域。

3. YOLOv8的概述YOLO(You Only Look Once)是一种快速、高效的目标检测算法,它采用单个神经网络来同时预测图像中所有物体的位置和类别。

YOLO 算法通过将图像划分为网格,并利用卷积神经网络对每个网格单元进行预测,从而实现对目标的快速检测和定位。

YOLOv8是YOLO系列算法的最新版本,它采用了一系列优化策略和技术,大大提升了目标检测的准确度和速度,使得它成为了目前最先进的目标检测算法之一。

4. EmguCV与YOLOv8的结合EmguCV和YOLOv8在图像处理和目标检测领域有着天然的契合点。

EmguCV提供了丰富的图像处理功能和工具,而YOLOv8则能够实现高效的目标检测。

将EmguCV和YOLOv8相结合,可以实现更加强大和全面的图像处理和目标检测应用。

利用EmguCV提供的图像处理函数和工具,可以对图像进行预处理和增强,然后将处理后的图像输入到YOLOv8模型中进行目标检测,从而实现对图像中目标的快速、准确的识别和定位。

5. 应用案例分析下面将以一些典型的应用案例为例,来说明EmguCV与YOLOv8的结合在图像处理和目标检测领域的应用场景和性能特点。

EmguCV类(CvInvoke_Class) 方法整理

EmguCV类(CvInvoke_Class) 方法整理

EmguCV类(CvInvoke_Class) 方法整理emgucv类(cvinvoke_class)方法整理方法―相机标定排序每个摄像机的转动矩阵(交互式地)并使两个摄像机图像平面处在相同的平面。

在不能晓得摄像头的固有参数和它们在空间的相对边线排序校正转换方法―内外方位元素确认calibratecamera(iinputarray,iinputarray,size,估计每个视图的照相机固有参数和外iinputoutputarray,iinputoutputarray,部参数ioutputarray,ioutputarray,calibtype,mcvtermcriteria)calibratecamera(mcvpoint3d 32f[][],pointf[][],估计每个视图的照相机固有参数和外size,iinputoutputarray,iinputoutputarray,部参数calibtype,mcvtermcriteria,mat[],mat[])solvepnpransacstereorectify利用ransac方法利用点对求解相机姿态undistortundistortpoints计算每个摄像机的旋转矩阵(虚拟地)使两个摄像机图像平面处于相同的平面。

转换图像以补偿径向和切向透镜失真与cvinitundistortrectifymap相似但也不同,相似的内容是他们都可用于校正镜头失真和透视变换。

不同的是函数cvinitundistortrectifymap实际上执行的是反向转换以初始化地图,而这个函数执行的是正向变换。

方法―数组、矩阵运算方法―头文件cvgetcolcvgetcolscvgetdiagcvgetimage回到头文件信息(header),对应输出数组的选定列于回到头文件信息,对应输出数组横跨的列数(colspan)回到头文件信息,对应输出数组的选定对角线回到图像的头文件信息,输出数据类型可以就是(matrix-cvmat*,orimage-iplimage*)cvgetmat回到输出矩阵的头文件信息,输出矩阵可以就是matrix-cvmat,image-iplimage或multi-dimensionaldensearray-cvmatnd*cvgetrawdatacvgetrowcvgetrowscvgetsubrect以高级别信息充填输入变量。

EmguCV类(CvInvoke_Class) 方法整理

EmguCV类(CvInvoke_Class) 方法整理
remap就是把一幅图像中某位置的像素放置到另一个图片指定位置即重映射repeat以源数组填充目标数组目标数组有可能比源数组大dstijsrcimodrowssrcjmodcolssrcwarpperspective将透视变换应用于图像也作投影映射即将图片投影到一个新的视平面warpaffine对图像应用放射变换vconcat垂直连接两个图像可用于扩展矩阵或拼接方法灰度值运算log计算输入数组的每个元素的绝对值的自然对数pow将输入数组的每个元素提升为dstisrcipifpisintegerdstiabssrcipotherwisedstisrcipifpisintegerdstiabssrcipotherwiseaccumulateproduct叠加两幅图像或他们的roibitwisexor对两个图像按位进行异处理dstisrc1isrc2imeanstddeviinputarrayioutputarrayioutputarrayiinputarray计算阵列元素的平均值和标准偏差meanstddeviinputarraymcvscalarmcvscalariinputarray为每个通道独立地计算阵列元素的平均值和标准偏差multiply计算两个数组的每个元素乘积
找到最小和最大元素值及其位置。如果阵列有多个通道,则必须为IplImage,并设置COI。
MulTransposed
计算原始数据及其转置的乘积(Calculates the product of src and its transposition. The function evaluates dst=scale(src-delta)*(src-delta)^T if order=0, and dst=scale(src-delta)^T*(src-delta) otherwise.)

EmguCV入门指南-中文翻译版

EmguCV入门指南-中文翻译版
MATRICES 如何使用........................................................................................................................ 6
深度作为泛型参数 .................................................................................................................. 6 矩阵深度 .................................................................................................................................. 6 XML 序.......................................................................................................... 7
创建图像 .................................................................................................................................. 3 自动垃圾回收 .......................................................................................................................... 4 像素的获取与赋值 .................................................................................................................. 4 方法 .......................................................................................................................................... 5 操作符重载 .............................................................................................................................. 5 泛型操作 .................................................................................................................................. 5 图像绘图 .................................................................................................................................. 5 Color 和深度的转换 ................................................................................................................. 5 显示图像 .................................................................................................................................. 5 XML 序列化 .............................................................................................................................. 6

EMGUCV基础

EMGUCV基础

第一章Emgu Cv简介:Emgu CV 是.NET 平台下对OpenCV 图像处理库的封装。

也就是OpenCV的.NET 版。

它运行在.NET 兼容的编程语言下调用OpenCV 的函数,如C#、VB、VC++等。

同时这个封装库可以在Mono 下编译和在Linux / Mac OS X 上运行。

Emgu Cv的优势在于.net非常完美的界面,给用户操作带来非常直观的感觉。

Emgu Cv每个版本都有修改一部分函数,在兼容旧版本下做的不是很好。

本书主要采用VS2013+EmguCv3.0版本,希望读者也采用相同的版本进行学习,从而避免一些版本兼容上的问题。

在国内并不流行Emgu Cv,因此关于Emgu Cv的资料比较少,从而导致了新手学习起来比较费劲,同时使更多想去学习Emgu Cv的人放弃学习,这样的一个恶性循环。

Emgu Cv安装和配置:Emgu Cv的安装还算比较简单,这边采用Emgu Cv3.0版本进行安装解析。

第一步:下载EmguCv3.0在官网https:///projects/emgucv/files/emgucv/进入界面选择3.0.0版本进行下载,如图1.1所示。

(写作时间为2016年4月,因此3.1版本也已经发布。

这边边通过对某一个版本的学习,在去了解其它版本的也是非常简单的。

)图1.1 Emgu Cv安装下载列表点击3.0.0进入下载界面,如图1.2所示。

图1.2 EmguCv3.0.0下载界面前两者是带有Cuda加速的Emgu CV,后两者则为没有带Cuda加速的Emgu Cv。

读者可以查看电脑是否支持Cuda加速进行选择。

这边笔者下载第二个。

第二部:安装EmguCv下载完成之后,如图1.3所示。

双击安装包进行提取文件,如图1.4所示,安装Emgu Cv的过程和安装其它软件的过程基本一致。

图1.3 EmguCv安装程序图1.4 提取EmguCv文件提取完成之后,如图1.5所示,得到EmguCv文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法
Add
数组相加
AddWeighted
数组权重相加
Add
数组相加
AddWeighted
数组权重相加
BitwiseAnd
计算两个数组的每元素的逐位逻辑连接:dst(I)= src1(I)&src2(I)if mask(I)!= 0。所有数组必须具有相同的类型(除了掩膜)和大小
dst(I)=src1(I) & src2(I)
Norm(IInputArray, NormType, IInputArray)
返回计算的范数。多通道阵列被视为单通道,即所有通道的结果相加。
Norm(IInputArray, IInputOutputArray, NormType, IInputArray)
返回计算的范数。多通道阵列被视为单通道,即所有通道的结果相加。
用于标定立体相机
StereoRectif平面处于相同的平面。
StereoRectifyUncalibrated
在不知道摄像头的固有参数和它们在空间的相对位置计算校正变换
方法
CalibrateCamera(IInputArray, IInputArray, Size, IInputOutputArray, IInputOutputArray, IOutputArray, IOutputArray, CalibType, MCvTermCriteria)
SolvePnPRansac
利用Ransac方法利用点对求解相机姿态
StereoRectify
计算每个摄像机的旋转矩阵(虚拟地)使两个摄像机图像平面处于相同的平面。
Undistort
转换图像以补偿径向和切向透镜失真
UndistortPoints
与cvInitUndistortRectifyMap相似但也不同,相似的内容是他们都可用于校正镜头失真和透视变换。不同的是函数cvInitUndistortRectifyMap实际上执行的是反向转换以初始化地图,而这个函数执行的是正向变换。
AbsDiff
计算两数组差值的绝对值
AccumulateSquare
对输入数据或其选中的ROI求和并平方(Adds the input src or its selected region, raised to power 2, to the accumulator sqsum)
AccumulateWeighted
Randu(IInputOutputArray, IInputArray, IInputArray)
返回均匀分布的随机数,填入数组或矩阵
Randu(IInputOutputArray, MCvScalar, MCvScalar)
返回均匀分布的随机数,填入数组或矩阵
SetIdentity
初始化标度单位矩阵
方法
CalibrationMatrixValues
使用计算的相机校准矩阵,像素中的图像帧分辨率和物理孔径大小来计算各种有用的相机(传感器/透镜)特性
DrawChessboardCorners
棋盘格角点的绘制(摄像机标定)
Find4QuadCornerSubpix
找到棋盘角的亚像素精度的准确位置
FindChessboardCorners
cvInitImageHeader
初始化图像的头文件结构,指针指向由用户指定,并返回指针。(Initializes the image header structure, pointer to which is passed by the user, and returns the pointer.)
返回图像的头文件信息,输入数据类型可以是(matrix - CvMat*, or image - IplImage*)
cvGetMat
返回输入矩阵的头文件信息,输入矩阵可以是matrix - CvMat, image - IplImage或multi-dimensional dense array - CvMatND*
用于标定立体相机(Estimates transformation between the 2 cameras making a stereo pair. If we have a stereo camera, where the relative position and orientatation of the 2 cameras is fixed, and if we computed poses of an object relative to the fist camera and to the second camera, (R1, T1) and (R2, T2), respectively (that can be done with cvFindExtrinsicCameraParams2), obviously, those poses will relate to each other, i.e. given (R1, T1) it should be possible to compute (R2, T2) - we only need to know the position and orientation of the 2nd camera relative to the 1st camera. That's what the described function does. It computes (R, T) such that: R2=R*R1, T2=R*T1 + T)
计算源数据的加权平均和,使得acc变为帧序列的运行平均值(Calculates weighted sum of input src and the accumulator acc so that acc becomes a running average of frame sequence: acc(x,y)=(1-alpha) * acc(x,y) + alpha * image(x,y) if mask(x,y)!=0 where alpha regulates update speed (how fastaccumulator forgets about previous frames).
cvGetRawData
以低级别信息填充输出变量。
cvGetRow
返回头文件信息,对应于输入数组的指定行。
cvGetRows
返回头文件信息,对应输入数组的指定行跨度。
cvGetSubRect
返回头文件,对应于输入数组的指定矩形。换句话说,它允许用户将输入阵列的一部分视为独立阵列。通过还可提取ROI的子阵列。
找到圆圈网格中心
GetDefaultNewCameraMatrix
返回默认的新相机矩阵
GetOptimalNewCameraMatrix
基于自由缩放参数返回新的相机矩阵
StereoCalibrate(IInputArray, IInputArray, IInputArray, IInputOutputArray, IInputOutputArray, IInputOutputArray, IInputOutputArray, Size, IOutputArray, IOutputArray, IOutputArray, IOutputArray, CalibType, MCvTermCriteria)
估计每个视图的照相机固有参数和外部参数
CalibrateCamera(MCvPoint3D32f[][],PointF[][], Size, IInputOutputArray, IInputOutputArray, CalibType, MCvTermCriteria,Mat[],Mat[])
估计每个视图的照相机固有参数和外部参数
尝试确定输入图像是否是棋盘图案的视图,并定位标定板内角点
FindCirclesGrid(Image<Gray, Byte>, Size, CalibCgType, Feature2D)
找到圆圈网格中心
FindCirclesGrid(IInputArray, Size, IOutputArray, CalibCgType, Feature2D)
BitwiseOr
计算两个数组的每元素逐位分离(Calculates per-element bit-wise disjunction of two arrays)
dst(I)=src1(I)|src2(I)
CalcCovarMatrix
计算一组向量的协方差矩阵
cvClearND
清除(设置为零)密集数组的特定元素或删除稀疏数组的元素。如果买没有元素,该函数不运行
StereoCalibrate(MCvPoint3D32f[][],PointF[][],PointF[][], IInputOutputArray, IInputOutputArray, IInputOutputArray, IInputOutputArray, Size, IOutputArray, IOutputArray, IOutputArray, IOutputArray, CalibType, MCvTermCriteria)
Swap(Mat, Mat)
交换两个矩阵
Swap(UMat, UMat)
交换两个矩阵
Trace
返回矩阵对角线元素之和
Transform
对src数组的每个元素进行矩阵变换,并将结果存储到dst中。源数组和目标数据应该有相同的深度、尺寸或ROI的尺寸。transmat和shiftvec应该是浮点型矩阵
Transpose
Gemm
执行广义矩阵乘法
dst = alpha*op(src1)*op(src2) + beta*op(src3), where op(X) is X or XT
相关文档
最新文档