欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC/OpenCV读取摄像头

程序员文章站 2024-03-21 23:39:58
...

参考链接:
利用MFC和OpenCV构建GUI程序读取摄像头视频
OpenCV关于视频处理的学习(VideoCapture类)-在检测中一些必要的图像操作

1. 新建一个简单的基于对话框的MFC工程”VedioS”

2. 建立对话框资源

  • 将”确认”的Caption改为”打开相机”
  • 将”取消”的Caption改为”退出”
  • 添加PICTURE控件,ID设置为 IDC_VEDIO_STATIC,Type设置为Rectangle,Color设置为Gray。

MFC/OpenCV读取摄像头

3.添加相应的处理函数

  • 在VedioSDlg.h中添加OpenCV的头文件及命名空间,以及判断相机是否成功打开的flag。
#include <opencv2/opencv.hpp>
using namespace cv;
...
...
public:
    afx_msg void OnBnClickedCancel();
    afx_msg void OnBnClickedOk();
    bool flag;  //判断相机或摄像头是否成功打开


在对应的cpp文件中进行初始化:

CVedioSDlg::CVedioSDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CVedioSDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    flag = FALSE;
}
  • 在 VedioSDlg.cpp中将OpenCV读取的视频关联到Picture控件(OpenCV默认是弹出一个窗口播放读到的视频)
BOOL CVedioSDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。
    ...
    ...
    // TODO:  在此添加额外的初始化代码

    namedWindow("VEDIO", WINDOW_AUTOSIZE);
    HWND hwndShow = (HWND)cvGetWindowHandle("VEDIO");
    //父窗口
    HWND hParents = ::GetParent(hwndShow);

    ::SetParent(hwndShow, GetDlgItem(IDC_VEDIO_STATIC)->m_hWnd);

    //函数原型:HWND SetParent(HWND hWndChild,HWND hWndNewParent),
    //hWndChild:子窗口句柄。
    //hWndNewParent:新的父窗口句柄。

    //隐藏父窗口
    ::ShowWindow(hParents, SW_HIDE);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
  • 添加”打开相机”的消息处理函数
void CVedioSDlg::OnBnClickedOk()
{
    // TODO:  在此添加控件通知处理程序代码
    CRect rect;
    //获取picture控件ID
    CWnd *pWnd = GetDlgItem(IDC_VEDIO_STATIC);
    //获取picture控件大小
    pWnd->GetClientRect(&rect);

    int x = rect.Width();
    int y = rect.Height();

    VideoCapture capture(0);  //0表示电脑摄像头,1表示外接摄像头
    flag = capture.isOpened();
    if (flag==false)
    {
        MessageBox(_T("未找到相机"),_T("提示"),MB_OK | MB_ICONERROR);
        return;
    }
    while (flag)
    {
        Mat frame;
        capture >> frame;
        Mat dst;
        resize(frame, dst, Size(x, y), 0, 0, 1);
        imshow("VEDIO", dst);
        waitKey(30);
    }
    CDialogEx::OnOK();
}
  • 添加”退出”的消息处理函数
void CVedioSDlg::OnBnClickedCancel()
{
    // TODO:  在此添加控件通知处理程序代码
    flag = false;
    CDialogEx::OnCancel();
}