65.9K
CodeProject 正在变化。 阅读更多。
Home

MFC 中的 OpenCV

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (10投票s)

2018年9月11日

CPOL

2分钟阅读

viewsIcon

33003

downloadIcon

2175

在 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库,可直接使用,位于两个文件夹内:includeres86,它们都包含在项目内部。 在互联网上,您可以轻松找到编译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日 - 发布文章
© . All rights reserved.