本次任务是设计一个能够实现OpenCV部汾功能的图像处理软件目的在于方便图像处理人员在具体编写OpenCV程序前,提前能够对图像进行简单处理进而帮助开发人员分析该如何对圖像进行处理。
使用C#对界面和逻辑进行开发界面开发的工具有很多,例如使用C++与QT进行开发OpenCV针对C++有专用的库,与QT也有良好的支持但是開发时间与C#比较长,并且生成的应用程序安装包较大不光是OpenCV相关的库文件需要打包进应用程序安装包,还有QT界面相关的库文件也需要添加过大的应用程序相当于简单的功能,两者并不协调所以使用C#进行界面逻辑的开发更为快捷方便。
使用OpenCVSharp实现图像处理功能在目前针對C#的计算机视觉库主要有两种,EmguCV和OpenCVSharpEmguCV的优势在于不仅仅提供了计算机视觉函数接口并且提供了一系列界面控件接口,但目前只支持OpenCV1的书写風格但是是通过把C++封装成动态链接库在C#中调用,这样在修改算法的过程中就会非常的不方便封装DLL的时候也比较麻烦。对于OpenCVSharp的工具从洺字就可以看出其是OpenCV提供给C#的接口。OpenCVSharp是OpenCV的.NET
wrapper它比EmguCV更接近于原始的OpenCV。网上常见的免费版EmguCV则是GUN协议任何发表都需要至少公布你的源代码,相仳之下OpenCVSharp则是相对温和多的LGUN协议对商业应用友好(基本上相当于BSD)。OpenCVSharp提供了OpenCV和OpenCV2两种书写风格因此设计使用OpenCVSharp进行图像处理的功能实现。
因此选用C#与OpenCVSharp搭配在VS2017下进行图像处理软件的开发
设计的应用程序用于进行简单的图像处理功能,因此考虑包含以下功能:
要实现以上各项功能除了使用表中第二列所示的基本方法外,还需要将C#控件与OpenCVSharp中的各类图像处理方法紧密联系
设计将图像处理功能选择ListBox与OpenCVSharp的各类图像处悝方法一一对应,而方法的各项参数统一存放在一个多维数组里C#中NumericUpDown控件在执行图像处理功能参数调整的时候通过调取这个多维数组,来實现修改参数的功能用户通过点击选择图像处理功能,对图像处理步骤队列ListBox中的元素进行添加程序内部通过判断这些元素及其排列,選择对应的OpenCVSharp图像处理方法对图像进行处理
这些步骤的简化示意图如下:
以下将详细介绍C#界面的设计和OpenCVSharp功能实现。
在一个C#窗体中添加需要嘚控件主要包括:按键(Button)、列表(ListBox)、图像显示窗(PictureBox)、文字显示窗(TextBox)等。对各控件属性进行设置例如按键名称、功能选择列表元素等。
程序甴个人独立开发设计一个独特的图标和应用程序名称,由本人命名为“sa蛋OpenCV试验器”
布局与界面效果设计完成后,对各个控件进行逻辑編程
打开图片功能与摄像头功能同时开启并不方便图像显示,因此当摄像头开启时点击“打开图片”按键不弹出文件选择界面,同时茬“通知消息显示”中通知应先关闭摄像头再打开图片打开文件功能由C#的OpenFileDialog类实现,相关程序如下图所示:
保存图片功能实现与打开图片步骤类似
点击“打开摄像头”按钮后,会触发此按钮的点击事件从而执行如下程序:
VideoCapture为OpenCVSharp所提供的摄像头类,可以方便快捷地开启摄像頭;cameraopen为自定义的bool型标识符由于表示摄像头是否已开启。
点击“使用说明”按钮弹出一个消息显示窗体此窗体由C#的MessageBox类实现,程序如下:
MessageBox類的Show()方法的第一个参数为显示消息内容第二个参数为窗体标题,第三个参数为窗体添加的按键此窗体添加一个确定按钮。
点击“刷新圖像”后执行以下程序:
主要通过myOPENCV_run()方法将打开的图像进行处理,此方法为自定义方法用于执行OpenCVSharp图像处理功能,在第四节详细说明
点擊“图像显示”后,执行以下程序:
MAT类的ToBitmap()方法作用是将一个MAT图转换为正常可以显示的图片,传给PictureBox进行显示
通知消息使用TextBox控件,通知消息需要能够翻阅即每次通知消息都是接着已有的通知信息进行添加。程序如下:
点击左侧列表进行功能选择首先弹出对应功能的参数設置界面,设计第二个窗体用于设置参数如下图所示:
每项功能都对应有四个参数,定义一个数组用于存放这些参数数组的行下标就昰对应的枚举过的参数名。数组定义如下:
当点击确定时数组的参数被修改为设定值,同时此窗体将选择的元素添加进图像处理列表。
图像处理需要按使用者选择的功能顺序进行执行是一个有序的操作。重新定义一个数组专门用来存放使用者选择出来的功能参数与功能列表定义的数组不同的是,前者要多一列用来存放功能对应的序号其他均相同。这样的作用是可以对数组存放序号的列进行依次檢索,从而能够按使用者选择的顺序进行执行图像处理功能此数组定义如下:
点击图像处理步骤列表的元素,同样弹出参数设置窗口這时将窗体的删除按钮等显现,实现对已经选择功能的删除功能删除或中间插入其他功能都需要对列表元素进行添加或删除,与此同时吔要对数组的行元素进行删除或插入使用循环即可完成上述步骤。
至此已大致介绍完实现此软件界面使用的逻辑和方法下面介绍录入應用程序的部分OpenCVSharp图像处理功能实现。
初始设想能够实现60种以上的基本图像处理功能由于设计开发的时间有限,个人的能力水平也有待提高因此只添加了较为基础的27种功能。
功能名称与OpenCVSharp中对应方法如下表:
上表功能均单独进行了实现通过检索图像处理步骤数组myOPENCV_runlist时,依次判断其每一行的第一个元素其中存放的为对应功能的序号(序号为已经枚举化的功能名称)。通过依次识别出的序号一步一步执行对應的图像处理功能,这一步骤由一个for循环加一个大型的switch-case实现部分代码如下:
执行对应图像处理方法时,将数组保存的参数带入即可实現功能的参数使用。
在项目属性中设置安装文件名称、快捷方式、文件夹等进行完上述步骤后即可生成一个安装包文件。由于添加了使鼡到的所有库文件因此其他Windows用户安装完后,大部分也可以正常使用
安装后虽然能够正常使用,但并不符合“小巧便捷”的最初设想洇此使用Enigma Virtual Box打包软件将安装后的程序目录进行再次打包,生成一个可以直接执行无需安装的exe文件如下图所示:
可直接执行的exe文件
至此设计基本完成,下面对软件进行简单测试:
-
点击“打开图片”按钮选择一张图片后即可在图像显示区域显示选择的图片。
-
左侧列表点击选择“人脸识别”弹出参数设置界面,直接点击“确定”即可添加“人脸识别”功能至右侧列表
-
点击“刷新图片”按钮,即可观察是否成功识别出图像中的人脸
-
观察下方通知栏显示的通知消息,与操作步骤一一对应
需要注意的是,部分功能对输入的图像有严格要求例洳“直方图均衡化”需要输入一个单通道的图像,这时需要先进行“颜色空间转换”将图像转换为灰度图后再进行下一步操作。若不按偠求添加功能多数会导致程序出错。
至此project已经暂时完成其实还有很多的设想都没来得及实现,比如如何在程序出错时不会崩溃、如何優化参数设置界面、如何添加更多更有用的图像处理功能