gpt4 book ai didi

c++ - 如何在MFC窗口中输出cv::Mat

转载 作者:太空宇宙 更新时间:2023-11-03 22:41:12 25 4
gpt4 key购买 nike

我有 2 个程序,MFC 程序和 OpenCV。我应该如何 union 程序?如何在MFC窗口中输出cv::Mat?我应该使用什么 MFC 小部件?我应该如何将 cv::Mat 转换为 MFC 小部件?

MFC程序:

#include <afxwin.h> 

class CMyMainWnd : public CFrameWnd
{
public:
CMyMainWnd() { Create(NULL, L"My title"); }
};

class CMyApp : public CWinApp
{
public:
CMyApp() {};
virtual BOOL InitInstance() {
m_pMainWnd = new CMyMainWnd();
m_pMainWnd->ShowWindow(SW_SHOW);
return TRUE;
}
};

CMyApp theApp;

OpenCV 程序:

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main() {

VideoCapture cap(0);

while (1) {

Mat frame;
cap >> frame;

if (frame.empty())
break;

imshow("Frame", frame);

char c = (char)waitKey(25);
if (c == 27)
break;
}

cap.release();

destroyAllWindows();

return 0;
}

最佳答案

您的main 示例的不同之处在于它不直接创建任何窗口。它让 opencv 创建窗口。

要复制该示例,只需将 opencv 循环移动到 CWinApp::InitInstance 并且不要创建单独的 MFC 窗口。

将opencv与MFC结合,使用opencv抓取视频帧,并在MFC窗口上绘制帧。

CWinApp::OnIdle 可用于持续更新窗口。 opencv 的 frame 包含位图位,这些位可以使用 SetDIBitsToDevice 或类似函数直接复制到 MFC windows 的 HDC

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;

关于c++ - 如何在MFC窗口中输出cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com