没有合适的资源?快使用搜索试试~ 我知道了~
首页MFC中如何使用OpenCV编程
资源详情
资源评论
资源推荐
在 MFC 中使用 OpenCV(文档下载: by http://www.codefans.net)
在 MFC 中使用 OpenCV
演示程序 CVMFC
本程序是在 MFC 中使用 OpenCV 的演示程序,由 3 部分组成。
一、Windows 下用 MFC 编制的程序框架
采用设备无关位图 DIB 实现 Windows 多文档模式下图像的显示,实现显示的关键函数 StretchDIBits
的原型如下:
int StretchDIBits(
HDC hdc, // 显示设备句柄
int XDest, // 目标矩形区域左上角 X 坐标
int YDest, // 目标矩形区域左上角 Y 坐标
int nDestWidth, // 目标矩形区域宽度
int nDestHeight, // 目标矩形区域高度
int XSrc, // 源矩形区域左上角 X 坐标
int YSrc, // 源矩形区域左上角 Y 坐标
int nSrcWidth, // 源矩形区域宽度
int nSrcHeight, // 源矩形区域高度
CONST VOID *lpBits, // 位图的像素存放首地址
CONST BITMAPINFO *lpBitsInfo, // 位图信息存放地址
UINT iUsage, // 位图中的颜色类型,RGB 模式用 DIB_RGB_COLORS
DWORD dwRop // 像素操作码,简单复制用 SRCCOPY
);
由于 OpenCV 中的位图结构中的像素数据与 DIB 中的像素具有相同的存储结构,见表 1 中的像素部分。
所以,只要为它构造一个 DIB 的位图信息就可以调用 API 函数 StretchDIBits 实现它的显示了。
表 1 DIB 位图参数与 IplImage 结构参数
参 数
DIB (MFC) IplImage (OpenCV)
宽 度
biWidth width
高 度
biHeight height
像素位数
biBitCount (1,4,8,16,24,32) = depth*nChannels depth (8,16,32,64)
通道数
--- nChannels (1,2,3,4)
(单通道位图) 调色板单元数
2
biBitCount
(2, 16, 256)
二值图像显示为灰阶图像
256 色彩色图像显示为真彩色图像
位图坐标原点 底-左 origin (0 顶-左,1 底-左)
像素分量存放方式 交叉存取 (按像素为单位存放) 0 交叉存取,1 位平面方式
对齐方式 (行像素数据凑整) 4 字节对齐 4 字节对齐或 8 字节对齐
每行字节数
(biWidth*biBitCount+31)/32*4 widthStep
像素字节数
((biWidth*biBitCount+31)/32*4)* biHeight imageSize
像素存放地址
BYTE* pBits char* imageData
感兴趣区域
--- roi
1
在 MFC 中使用 OpenCV(文档下载: by http://www.codefans.net)
表中正体字母部分表示相同的参数,粗体字母表示参数部分相同时的交集,斜体加下划线表示结构特
有的参数。
位图的宽度、高度、像素存放首地址、每行字节数、像素总字节数等 5 个参数在两种结构中相同。
像素位数、通道数、坐标原点位置、像素分量存放方式、对齐方式等 5 个参数在两种结构中部分相同,
使用时可以取其交集,表中用粗体字表示。
有 2 个参数是两种位图各自独有的,感兴趣区域为 IplImage 结构所独有,调色板单元为 DIB 所独有。
从表 1 中可以看出,除了高精度图像(位深度 16,32,64)外,这两种位图结构在图像处理的绝大部分应
用中可以通用。
从以上比较中也可看出,IplImage 结构适用于高精度处理,并且可以限制处理的区域;而 DIB 适用于
Windows 图形操作,并且可以存储低位数图像文件,如每像素一位的二值图像与像素 8 位的索引图像等。
另一种实现 MFC 的方法是采用 CvvImage 类,它有一个特点,就是其成员函数 DrawToHDC 可将位图
全部经缩放后显示到窗口中。这样,虽然能够察看全图,但当位图与窗口的长宽比不一致时会造成图像
失真。而采用 DIB 实现的显示比例可选择为 1:1,图像显示没有经过缩放,显示画面按窗口大小进行裁
剪,并可使用滑动条选择显示部位,这比较符合图像采集与处理的使用习惯。
二、调用 OpenCV 函数实现处理
使用 OpenCV 函数处理图像在 MFC 环境下显示,实现功能为图像平滑、图像缩小与 Canny 边缘检测。
根据《学习 OpenCV》一书第 2 章的 3 个例子(例 2-4,2-5,2-6) 改编而成。例 2-4 与 2-5 使用例图
fruits.jpg,例 2-6 使用例图 lena.jpg。还增加了若干图像处理常用功能,详见下面表 2 菜单结构列表。
视频播放也用 OpenCV 函数实现,根据《OpenCV 教程(基础篇)》中第 3 章的例 3-5 改编而成,用的
是 highgui 函数,测试视频文件为 globe.avi。
例图文件都在 image\ 目录下。
三、用 DirectShow 编制的视频采集程序
采用 DirectShow 实现视频采集,其优点是支持高分辨率图像采集,最高分辨率由所用的摄像头决定 ,
如罗技 130 万像素 USB 摄像头 C300 最高分辨率可达 1280*1024,在 MPEG 模式下采集速度为每秒 15 帧。
使用时 CPU 的时间占用率在 15~30%之间。
通过多图像平均可以采集得到质量不错的图像,经过 4 幅图像平均采集所得图像的信噪比可提高一倍。
由于需要连续采集多帧图像,约需 0.25 秒,故适宜采集静态或缓慢移动对象的图像。
视频采集功能调用 OpenCV China 网站下载的软件 camerads 中的函数实现。
主要内容
下面列出 stdafx.h 尾部集中的几个头文件,程序结构由此可见一斑。
#include "CVMFC.h" // 窗口管理
#include "cv.h" // OpenCV 头文件
#include "highgui.h"
#include "CameraDS.h" // DirectShow(基于 OpenCV)
#include "CVDSCap.h" // 视频采集接口
2
在 MFC 中使用 OpenCV(文档下载: by http://www.codefans.net)
CVMFC 的菜单结构
程序分为文件、点处理、邻域处理、二值图像处理、形态学处理、综合处理例与视频采集播放等七、
八个菜单条共 70 个功能,近半数功能由参考文献上的程序修改而成,为了便于找到相应参考材料进行对
照,在程序中附上了它们的出处。程序的菜单结构见表 2,其中列出了演示程序的大多数功能。
表 2 CVMFC 菜单结构
文件 点处理 邻域处理 二值图像处理 形态学处理 综合处理例 视频采集播放
打开图像 彩色变灰阶 邻域平均 选择阈值 腐蚀 图像缩小 启动摄像头
恢复图像 图像反相 Gauss 滤波 自适应阈值法 膨胀 径向梯度 打开 AVI 文件
关闭当前窗口 垂直镜像 中值滤波 全局阈值法 开运算 Canny 算法 视频解冻
保存当前位图 水平镜像 Sobel 算法 外接矩形 闭运算 种子填充 视频冻结
最近文件 180 度旋转 Laplace 算法 最小面积矩形 形态学梯度 金字塔图像分割 多图像平均
恢复原始图像 30 度旋转 点集凸包 顶帽变换 椭圆曲线拟合 关闭视频
当前画面存盘 亮度变换 区域凸包 波谷检测 Snake 原理 选择分辨率
退出 图像直方图 轮廓跟踪 分水岭原理 动态边缘检测
直方图均衡化 距离变换 角点检测 L_K 光流跟踪
典型例图
各类功能都有一定的特异性,为了突出各功能的实效,建议初次使用时先用表 3 中列出的例图进行处
理。这些例图在程序包的 Image\目录下,表中也对一些功能作了简要的说明。
表 3 功能的典型例图
功能名称 典型例图 简要说明
外接矩形 (BoundingRect) ExampleL.bmp、
ExampleQ.bmp
仅适用于单连通区域,
不能处理多连通区域与孔边界
最小面积矩形 (MinAreaRect2)
区域凸包 (ConvexHull2)
轮廓跟踪 (FindContours) ExampleC.bmp、
SteelBar.bmp 、 pic3.pn
g
适用各类二值图像,使用范围较宽
图像反相后也可进行处理,得到不同结果
距离变换 (DistTransform)
顶帽变换 ExampleD.bmp 为灰值形态学运算,波谷检测又称黑顶帽变换
图像反相后处理与另一方法直接处理等价
波谷检测
图像缩小 lena.jpg、fruits.jpg
径向梯度 lena.jpg、fruits.jpg
Canny 算法 lena.jpg
Hough 变换(直线) (HoughLines2) pic1.png
Hough 变换(圆) (HoughCircles) stuff.jpg
平行四边形检测 pic1.png、pic2.png
种子填充 (FloodFill) fruits.jpg 鼠标选种子,命令键 C、M、R、S、F、G、8、4,ESC
金字塔图像分割 (PyrSegmentation) fruits.jpg 滑动条调节参数,任意键退出
椭圆曲线拟合 (FitEllipse) stuff.jpg、rice.tif 滑动条调节参数,任意键退出
Snake 原理 (SnakeImage) ring.bmp、square.bmp 滑动条调节参数,ESC 退出
分水岭原理 (Watershed) fruits.jpg 鼠标绘制区域标记,R 清除,W 或 Enter 分割,ESC 退出
角点检测 (GoodFeaturesToTrack) chessboard.jpg 滑动条调节参数,鼠标确定检测范围,任意键退出
人脸检测 (HaarDetectObjects) lena.jpg
3
在 MFC 中使用 OpenCV(文档下载: by http://www.codefans.net)
打开 AVI 文件 globe.avi 不能播放用 Mpeg 压缩的视频文件
L_K 算法光流跟踪 鼠标选择跟踪点,命令键 R、C、N,ESC 退出
程序结构
程序采用 VC++多文档结构,图像的存放与处理则采用 OpenCV 的结构与函数,图像的显示采用位图
信息 m_lpBmi 实现,为了便于管理对 m_lpBmi 的操作集中在 OnDraw 程序中。待显示位图结构发生改变
时用 m_dibFlag 标志激发 m_lpBmi 的刷新。除了文件结构与图像显示外,其余部分基本上是 OpenCV 程序。
位图数据:CVMFCDoc 中 pImg (读入图像文件所得原始位图)
CVMFCView 中 workImg (工作位图)、saveImg (备份位图)
m_lpBmi (工作位图的位图信息)
CVDSCap 中 m_Frame (视频采集所得位图)
视图的显示:
void CCVMFC0View::OnDraw(CDC* pDC)
{
CCVMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if (pDoc->pImg!=NULL) { // 有磁盘输入图像
CSize sizeTotal;
sizeTotal = CSize(pDoc->pImg->width,pDoc->pImg->height);
SetScrollSizes(MM_TEXT, sizeTotal);
if (pDoc->m_Display==0) { // 输入图像尚未显示
newCloneImage(pDoc->pImg, &saveImg); // 复制到备份位图
m_dibFlag=newCloneImage(saveImg, &workImg); // 复制到工作位图
m_ImageType=pDoc->pImg->nChannels; // 设置标志
m_SaveFlag=m_ImageType;
pDoc->m_Display=1;
}
}
if (m_dibFlag) { // 刷新 DIB 位图信息
if (m_lpBmi)
free(m_lpBmi);
m_lpBmi = CtreateMapInfo(workImg, m_dibFlag);
m_dibFlag = 0;
}
if (workImg) { // 刷新窗口画面
StretchDIBits(pDC->m_hDC, 0, 0, workImg->width, workImg->height,
0, 0, workImg->width, workImg->height,
workImg->imageData, m_lpBmi, DIB_RGB_COLORS, SRCCOPY);
}
}
4
剩余15页未读,继续阅读
BURUCE735
- 粉丝: 0
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0