MFC 中的 OpenCV
在 MFC 项目中使用 OpenCV 的方法
项目 (OneDrive): https://onedrive.live.com/embed?cid=DEDCB6EF190B8FD4&resid=DEDCB6EF190B8FD4%21411&authkey=ANtICXVGKPsQ030
引言
我多次看到关于如何在MFC项目中使用OpenCV的问题,所以我决定做一个简单的应用程序演示,一个VS2010项目,展示一种在VC/MFC项目中使用计算机视觉库的方法,该项目在一个MDI应用程序中开发。 据我所知,我曾经在某个地方看到一个基于CDialog
的应用程序,它嵌入了OpenCV ... 这是另一种方法:多文档界面,您可以在其中加载多个媒体文件。
背景
本文不涉及OpenCV的编译,但确实包含编译好的OpenCV库,可直接使用,位于两个文件夹内:include 和 res86,它们都包含在项目内部。 在互联网上,您可以轻松找到编译OpenCV的方法,这不是本文的目的。
设置项目的步骤
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
opencv_flann341d.lib
opencv_highgui341d.lib
opencv_imgcodecs341d.lib
opencv_imgproc341d.lib
opencv_ml341d.lib
opencv_objdetect341d.lib
opencv_photo341d.lib
opencv_shape341d.lib
opencv_stitching341d.lib
opencv_superres341d.lib
opencv_video341d.lib
opencv_videoio341d.lib
opencv_videostab341d.lib
在Debug情况下,Release情况下使用相同的库,但文件名中没有 "d
"。 示例:opencv_calib3d341.lib 而不是 opencv_calib3d341d.lib。
Using the Code
项目的结构非常简单:文档类包含一个cv::VideoCapture
对象,用于读取视频文件,一个cv::Mat
对象,用于将cv::VideoCapture
转换为cv::Mat
对象,以及一个BITMAPINFO
结构,用于将cv::Mat
对象转换为bitmap
对象,以便用于CView
渲染。 这种转换可以在CTempoDoc::SetupBitmapInfo
方法中找到。
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
的内容,双缓冲。 并且为加载的文件是视频流的情况实现了一个计时器,该计时器将知道何时加载和渲染视频的下一帧。 此外,此类还包含另一个处理程序,用于处理窗口大小更改时或视频的下一帧准备好渲染时如何在CView
上擦除和绘制内容,以及一些在窗口内缩放图像的方法。 所有这些都可以在示例项目中进行探索。
在这里,您拥有一个可以加载静态图像或各种视频到MDI应用程序中的应用程序。 尽情享受吧!
关注点
计算机视觉库的使用越来越多,我在这里提供一种将您的OpenCV算法包含在实际桌面应用程序中的方法。
历史
- 2018年9月11日 - 发布文章