在计算机视觉领域,OpenCV是一个非常流行的库,它提供了大量的图像处理和计算机视觉功能。然而,将OpenCV集成到MFC(Microsoft Foundation Classes)项目中可能会遇到一些挑战。本文将介绍如何在Visual Studio2010项目中使用OpenCV库,创建一个多文档界面(MDI)应用程序,该应用程序可以加载和处理静态图像以及视频文件。
本文不涉及OpenCV的编译过程,但假设已经有了编译好的OpenCV库。这些库文件位于项目的两个文件夹“include”和“res86”中。可以从互联网上找到编译OpenCV的方法,但这并非本文的重点。
要开始使用OpenCV库,需要按照以下步骤设置MFC项目:
附加包含目录: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的内容。如果加载的文件是视频流,该计时器将知道何时加载和渲染下一帧。此外,该类还包含另一个处理程序,负责在窗口大小发生变化或视频的下一帧准备渲染时,如何处理内容的擦除和绘制,以及一些在窗口内缩放图像的方法。所有这些都可以探索在示例项目中。