Ваш пример main
отличается тем, что он не создает окна напрямую.Это позволяет opencv создать окно.
Чтобы продублировать этот пример, просто переместите цикл opencv в CWinApp::InitInstance
и не создавайте отдельное окно MFC.
Чтобы объединить opencv с MFC, используйте opencv для захвата видеокадра.и нарисуйте рамку в окне MFC.
CWinApp::OnIdle
можно использовать для постоянного обновления окна.frame
в opencv включает биты битовой карты, эти биты могут быть скопированы непосредственно в HDC
окон MFC, используя SetDIBitsToDevice
или аналогичные функции.
class CMyMainWnd : public CFrameWnd
{
cv::VideoCapture video;
public:
CMyMainWnd()
{
video.open(0);
}
void CMyMainWnd::OnPaint()
{
CPaintDC dc(this);
cv::Mat mat;
video >> mat;
if(mat.empty())
return;
BITMAPINFOHEADER bi = { sizeof(bi) };
bi.biWidth = mat.cols;
bi.biHeight = -mat.rows;
bi.biBitCount = (WORD)(mat.channels() * 8);
bi.biPlanes = 1;
SetDIBitsToDevice(dc, 0, 0, mat.cols, mat.rows, 0, 0, 0, mat.rows,
mat.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyMainWnd, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance()
{
CWinApp::InitInstance();
CMyMainWnd *wnd = new CMyMainWnd();
m_pMainWnd = wnd;
wnd->Create(NULL, L"My title");
wnd->ShowWindow(SW_SHOW);
return TRUE;
}
BOOL OnIdle(LONG lCount)
{
CWinApp::OnIdle(lCount);
m_pMainWnd->Invalidate(FALSE);
return TRUE;
}
};
CMyApp theApp;