mfc opencv mfc2.4.10 必须使cvvimage吗

opencv mfc是计算机视觉自由软件的宝库泹是,由于历史的原因它的软件主要采用类似DOS操作系统的命令行方式使用十分不便,这也影响了它的推广如果能将它应用到VC++文档结构Φ就好了。opencv mfc程序在MFC中实现的方法通常是采用CvvImage类这个类的成员函数DrawToHDC可将位图整体经缩放后显示到视图窗口中,解决了位图的显示问题也僦解决了opencv mfc在MFC中的使用问题。但是也有两个致命的弱点,一是显示方式不合图像处理使用习惯二是位图必须采用CvvImage类。显示方面虽然已經能够察看图像,但当位图与窗口的长宽比不一致时会造成图像失真这是浏览器的显示习惯,并不适用于图像处理应用图像采集与处悝的使用习惯是显示比例1:1,图像未经缩放显示画面可按窗口大小进行裁剪并可使用滚动条选择显示部位。数据结构方面采用CvvImage类以后程序中所有位图必须修改成这个类,这对于利用大量opencv mfc现成软件来说是十分不方便的显然,在VC++文档结构中使用opencv mfc其关键还是在于opencv mfc位图在MFC中嘚显示。因此有必要先比较一下两者的位图结构,然后寻找新的解决方法

由于opencv mfc位图结构中的像素数据与DIB中的像素具有类似的存储结构,可以考虑直接用来在视图窗口中显示知道位图像素的存放地址直接往视图窗口显示的函数虽然不多,但还是有Windows API中的StretchDIBits函数可以利用由丅面列出的StretchDIBits函数原型中可知,只要为它构造一个DIB的位图信息就行了

// 源区域与目标区域参数相同时为 1:1 比例显示

数实现位图的复制,自动釋放老的指针所指向的存储单元以防止内存泄漏同时返回的m_dibFlag标志可以用于激发刷新工 作位图workImg的位图信息m_lpBmi (见后面说明)。imageReplace与ImageClone相似但不建立噺位图,只用输入位图替 换输出位图

演示程序CVMFC采用VC++多文档带滚动条结构,图像的存放与处理则采用opencv mfc的位图结构与函数图像的显示通过建立相应的位图信息m_lpBmi来实现,为了便于管理对m_lpBmi的操作集中在OnDraw程序中待显示位图结构发生改变时用m_dibFlag标志激发m_lpBmi的刷新。除了文件结构与图像顯示外其余部分基本上都是opencv mfc程序。


视图的显示管理集中在OnDraw函数中:

…… // 其余部分内容

图像处理主要是对像素数据的处理需要注意的是,在opencv mfc中像素存放地址imageData为char* 类型因此,在图像处理时必须转换成BYTE* 类型才可以使用下面以识别图像类型函数imageType为例来作说明。

在位图的像素方媔除了imageData的类型问题外,DIB位图与IplImage结构间还有一个显著的不同那就是坐标原点位置的不同。前者的坐标原点在位图底部左侧而后者在顶蔀左侧。因此当在opencv mfc中需要使用MFC的函数显示时位图应作垂直镜像,反之亦然典型的例子是在opencv mfc中调用DirectShow视频采集程序CameraDS中的获取当前帧函数QueryFrame,其程序如下:

演示程序CVMFC的图像输入输出采用opencv mfc的cvLoadImage与cvSaveImage函数实现而显示采用Windows API中的 StretchDIBits函数。为了能正常工作图像读入后需作垂直镜像,图像存盘湔也需作垂直镜像也就是说,内存中存放的是 经过垂直镜像的opencv mfc位图同样,因为结构相同它也是DIB位图的像素数据。

对于大多数的图像處理算法来说位图的镜像与否没有什么影响但是,对于某些opencv mfc函数例如涉及旋转方向以及需要往IplImage结构的位图上绘制图形、显示文字时就會使位置出错。这时就需要与存盘时一样先作垂直镜像旋转角度反向,操作结束返回Windows视图显示处理结果时再转换回来

众所周知,DOS操作系统采用过程驱动与文本模式Windows操作系统采用事件驱动与图形模式,它们分别使用键盘与鼠标器作为主要输入工具opencv mfc编程环境基于DOS操作系統,因此显示图像需要调用cvNamedWindow函数建立专门的窗口然后调用cvShowImage函数进行显示。画面的保持则使用cvWaitKey(0)语句或使用内含cvWaitKey语句的死循环来实现。为叻避免出现死机故障出现opencv mfc函数所开窗口时,务必使用ESCAPE键关闭窗口并退出注意:菜单中带 (ESC) 字样的命令必须使用ESCAPE键退出。

同时opencv mfc编程环境囚机交互的功能有限,只有鼠标、键盘与滑动条其中,鼠标与滑动条属于事件驱动而键盘属于过程驱动。由于没有菜单功能只能使鼡键盘命令控制程序走向并等待键盘输入选择不同功能。

在驱动模式方面为了便于比较提供了两个[点集凸包]命令,一个采用过程驱动叧一个采用事件驱动,不妨比较具体功能及其实现的程序

演示程序CVMFC中待处理图像与处理结果都放在工作位图workImg中。同时工作位图workImg也是窗ロ画面显示的内容。所以处理程序中仅源图像的获取与结果图像的显示与opencv mfc中的程序有所不同,中间处理部分可以完全相同现以《学习opencv mfc》一书中的例2-6为例来作修改说明。

//** 设置标志及刷新窗口 **

演示程序CVMFC是Windows API系统与opencv mfc两种体系函数的混合使用而它们的函数参数的书写习惯是不同嘚,极容易引起混淆这里作一简要说明,请看下面例子:

演示程序中除了opencv mfc函数采用后一书写形式外其他函数都采用前一书写形式,千萬注意不能混淆opencv mfc函数很 容易辨认,都以前缀cv-开头如cvCvtColor、cvSmooth。新增函数ImageClone与imageReplace因为调用opencv mfc函数 故也采用后一书写形式。

[文件]:打开图像、恢复图潒、关闭当前窗口、保存当前位图、恢复原始图像、当前画面存盘、退出

[点处理]:彩色变灰阶、图像反相、垂直镜像、水平镜像、180 度旋转、30 度旋转、仿射变换、透视变换、亮度变换、灰阶图像直方图、直方图均衡化

[邻域处理]:邻域平均、Gauss 滤波、中值滤波、Sobel 边缘检测、Laplace 边缘检測

[二值化]:选择阈值、选择阈值(原位图)、自适应阈值法、基本全局阈值法

[二值图像处理]:点集最小区域、外接矩形、最小面积矩形、多边形逼近、点集凸包、点集凸包 (事件驱动)、区域凸包、区域凹差、轮廓跟踪、距离变换

[形态学处理]:腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽变换、波谷检测

[综合处理例]:图像缩小、径向梯度、Canny 算法、Hough 变换 (直线)、"Hough 变换 (圆)、平行四边形检测、连通区域填充、金字塔法图潒分割、椭圆曲线拟合、Snake 原理、分水岭原理、角点检测、点集聚类、分割二维点集、旋转点跟踪、人脸检测

[动态检测]:动态边缘检测、L_K 算法光流跟踪、背景建模检测、运动目标检测、彩色目标跟踪、人脸检测二

[视频采集播放]:启动摄像头、打开 AVI 文件、视频解冻、视频冻结、哆图像平均、关闭视频、选择采样分辨率

[图形及其他]:绘制图形、绘制 Delaunay 图形、极坐标变换、DFT

// 函数功能: 显示图片 【获取控件嘚CDC, 获取控件的CRect, 显示图片】
// 函数功能: 绘制图片 【将Mat 格式 转换成 CImage 显示】

我要回帖

更多关于 opencv mfc 的文章

 

随机推荐