Как вывести cv :: Mat в окно MFC - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть 2 программы, программа MFC и OpenCV.Как мне следует объединять программы?Как вывести cv :: Mat в окно MFC?Какой виджет 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;
}

1 Ответ

0 голосов
/ 16 ноября 2018

Ваш пример 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...