VC 开发网 http://www.vckf.net 在 MFC 中使用 OpenCV
4
程序结构
程序采用 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);
}
}
CCVMFC 模块中增加了 4 个函数,即 CtreateMapInfo、imageType、imageClone 与 imageReplace。
CtreateMapInfo 函数用于建立工作位图 workImg 的位图信息 m_lpBmi,其特点是可以为单通道位图设置两