在MFC项目中使用OpenCV的指南

计算机视觉领域,OpenCV是一个非常流行的库,它提供了大量的图像处理和计算机视觉功能。然而,将OpenCV集成到MFC(Microsoft Foundation Classes)项目中可能会遇到一些挑战。本文将介绍如何在Visual Studio2010项目中使用OpenCV库,创建一个多文档界面(MDI)应用程序,该应用程序可以加载和处理静态图像以及视频文件。

本文不涉及OpenCV的编译过程,但假设已经有了编译好的OpenCV库。这些库文件位于项目的两个文件夹“include”和“res86”中。可以从互联网上找到编译OpenCV的方法,但这并非本文的重点。

项目设置步骤

要开始使用OpenCV库,需要按照以下步骤设置MFC项目:

  1. 将“input”和“x86”文件夹放入项目中。
  2. 设置项目配置,包括:

附加包含目录:C:\Flaviu\Tempo\include;%(AdditionalIncludeDirectories)(将"C:\Flaviu\"替换为路径)。

附加库目录:C:\Flaviu\Tempo\x86\vc10\lib;%(AdditionalLibraryDirectories)(将"C:\Flaviu\"替换为路径)。

附加依赖项:包括opencv_calib3d341d.lib、opencv_core341d.lib、opencv_features2d341d.lib等库文件。对于Debug版本,使用带"d"的库文件,对于Release版本,使用不带"d"的库文件。例如,opencv_calib3d341.lib对应于opencv_calib3d341d.lib。

使用代码

项目的文档类包含一个cv::VideoCapture对象,用于读取视频文件,一个cv::Mat对象用于将cv::VideoCapture转换为cv::Mat对象,以及一个BITMAPINFO结构,用于将cv::Mat对象转换为位图对象,以便在CView中渲染。这种转换可以在CTempoDoc::SetupBitmapInfo方法中找到。

以下是一个示例代码,展示了如何设置BITMAPINFO结构:

void CTempoDoc::SetupBitmapInfo(cv::Mat& mat) { if (NULL != m_pBmi) { delete m_pBmi; m_pBmi = NULL; } m_pBmi = new BITMAPINFO; BITMAPINFOHEADER* pHeader = &m_pBmi->bmiHeader; pHeader->biSize = sizeof(BITMAPINFOHEADER); pHeader->biPlanes = 1; pHeader->biCompression = BI_RGB; pHeader->biXPelsPerMeter = 100; pHeader->biYPelsPerMeter = 100; pHeader->biClrUsed = 0; pHeader->biClrImportant = 0; pHeader->biWidth = m_Mat.cols; pHeader->biHeight = -m_Mat.rows; pHeader->biBitCount = 24; m_pBmi->bmiHeader.biSizeImage = 0; }

CTempoDoc类还包含一个巧妙的方法ResizeMat(cv::Mat& mat),该方法修正了格式不正确的cv::Mat对象(实际上是为从cv:imread获取的OpenCV对象添加了一个新的列)。

渲染处理在CView类中进行。在这里,可以找到众所周知的OnDraw方法,它以双缓冲的方式渲染CTempoDoc::BITMAPINFO的内容。如果加载的文件是视频流,该计时器将知道何时加载和渲染下一帧。此外,该类还包含另一个处理程序,负责在窗口大小发生变化或视频的下一帧准备渲染时,如何处理内容的擦除和绘制,以及一些在窗口内缩放图像的方法。所有这些都可以探索在示例项目中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485