OpenCv实现与MFC的整合

视频~视频还是视频。最近折腾了好久的H264采集和显示,使用Opencv想要将采集的数据在对应的对话框中显示而不是不是单独的一个窗体。于是百度google了。终于解决了:

三部曲:

下载CvvImage源码,OPenCv2.2以前的版本存在该文件

将源文件加入到工程中,并在Dialog中添加一个PicCtrl控件,设置为Rectangle

在代码中添加如下代码:

#pragma once

#include
#include
#include
#include "CvvImage.h"
class CCapture
{
public:
CCapture(void);
~CCapture(void);
BOOL Init(void);
BOOL DeInit(void);
IplImage *GetPicture();
BOOL Display(HDC hDC,CRect nRect);
int GetFrameCnt()
{
int nCnt = m_nFrameCnt;
m_nFrameCnt= 0;
return nCnt;
}
private:
BOOL m_nNeedWin;
IplImage *m_pFrame;
CvCapture *m_pCapture;
CvvImage m_nImg;
int m_nFrameCnt;
};


CCapture::CCapture(void)
:m_pFrame(NULL)
,m_pCapture(NULL)
,m_nNeedWin(TRUE)
, m_nFrameCnt(0)
{
}


CCapture::~CCapture(void)
{
if(m_pCapture)
{
cvReleaseCapture(&m_pCapture);
m_pCapture = NULL;
}
}


BOOL CCapture::Init(void)
{
if(m_pCapture == NULL)
{
m_pCapture = cvCreateCameraCapture(-1);
if(m_pCapture == NULL)
{
return FALSE;
}
return TRUE;
}
m_nFrameCnt = 0;
return FALSE;
}


BOOL CCapture::DeInit(void)
{
if(m_pCapture)
{
cvReleaseCapture(&m_pCapture);
m_pCapture = NULL;
}
return 0;
}


IplImage* CCapture::GetPicture()
{
if(m_pCapture)
{
m_pFrame = cvQueryFrame(m_pCapture);
m_nFrameCnt++;
return m_pFrame;
}
return NULL;
}


BOOL CCapture::Display(HDC hDC,CRect nRect)
{
m_nImg.CopyOf(m_pFrame);
m_nImg.DrawToHDC(hDC, &nRect );
return TRUE;
}


调用该类如下:

IplImage *pImg = NULL;
int nDataLen =0;
CRect rect;
CDC *pDC = GetDlgItem(IDC_SHOW)->GetDC();
HDC hDC= pDC->GetSafeHdc();
GetDlgItem(IDC_SHOW)->GetClientRect(&rect);
while(m_bStatus == TRUE)
{
if((pImg = cCap.GetPicture()) != NULL)
{
cCap.Display(hDC,&rect);
}
}
ReleaseDC(pDC);
cCap.DeInit();
return;



你可能感兴趣的:(MFC)