Opencv +mfc 实现录像

环境

  • Opencv版本3.20
  • vs2017

主要使用的类

  1. 使用VideoCapture大开本地摄像头
  2. 使用VideoWriter写入帧,保存AVI视频文件

功能

  1. 可以录像,设置录像文件大小
  2. 可以打开本地视屏文件播放
  3. 实时显示摄像头视频

关键实现

  • 渲染一帧到Picture Control控件

void CVCRDlg::VideoShow()
{
    
    myCamear.GetInstanCap(0);
    Mat g_srcImage;
    BITMAPINFO*               m_bmi;
    BITMAPINFOHEADER*         m_bmih;
    unsigned int              m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];

    m_bmi = (BITMAPINFO*)m_buffer;
    m_bmih = &(m_bmi->bmiHeader);
    memset(m_bmih, 0, sizeof(*m_bmih));
    m_bmih->biSize = sizeof(BITMAPINFOHEADER);

    CDC *pWnd = GetDlgItem(IDC_STATIC)->GetDC();
    CRect rect;
    GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
    HDC hDC = pWnd->GetSafeHdc();

    *myCamear.m_vcap >> g_srcImage;

    m_bmih->biWidth = g_srcImage.cols;
    m_bmih->biHeight = -g_srcImage.rows;           // 在自下而上的位图中 高度为负
    m_bmih->biPlanes = 1;
    m_bmih->biCompression = BI_RGB;
    m_bmih->biBitCount = 8 * g_srcImage.channels();

    //GetDlgItem(IDC_PIC_STATIC) - > GetDC(); // GetDlgItem(IDC_PIC_STATIC)意思是获取显示控件的句柄(句柄就是指针)
    StretchDIBits(hDC, 0, 0, rect.Width(), rect.Height(), 0, 0, g_srcImage.cols, g_srcImage.rows, g_srcImage.data, (BITMAPINFO*)m_bmi, \
        DIB_RGB_COLORS, SRCCOPY);
    ReleaseDC(pWnd);

 

 

 


}

  • 保存帧到文件

void CVCRDlg::SaveTrameToFile(CString Filename, int FrameNum)
{
    KillTimer(TEXT);
    USES_CONVERSION;
    Mat Frame;
    CString Text = "正在录制...";
    CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
    pProg->SetRange(0, FrameNum);
    pProg->SetPos(0);
    int Temp = 1;

    Size sWH = Size((int)myCamear.m_vcap->get(CV_CAP_PROP_FRAME_WIDTH),(int)myCamear.m_vcap->get(CV_CAP_PROP_FRAME_HEIGHT));
    
    int numb = int(FrameNum / 9000) + 1;
    vector<VideoWriter*>outputVideo;
    for (int loop = 0; loop < numb; loop++)
    {
        CString Name;
        Name.Format("%s_%d.avi", Filename, loop);
        outputVideo.push_back(new VideoWriter());
        outputVideo[loop]->open((LPSTR)(LPCSTR)(Name), CV_FOURCC('M', 'P', '4', '2'), 30.0, sWH);
    }

    while (myCamear.m_vcap->isOpened() && FrameNum > 0)
    { 
        *myCamear.m_vcap >> Frame;
        if (Frame.empty()) break;
        *outputVideo[(int)Temp / 9000] << Frame;
        Sleep(30);
        Text.Format("正在录制... 第%d帧  录制时间:%d", Temp, (int)Temp/30);
        SetDlgItemText(IDC_STATICT1, Text);
        FrameNum--;
        pProg->SetPos(Temp);
        Temp++;
    }

    for (int loop = 0; loop < numb; loop++)
    {
        outputVideo[loop]->release();
    }

    SetTimer(TEXT, 1000, NULL);
    SetDlgItemText(IDC_STATIC2, " ");
    m_ToalTime = 0;
    MessageBoxA("录像完成", "提示", MB_OK);
    pProg->SetPos(0);
}

 

  • 运行截图

Opencv +mfc 实现录像

 

完整代码工程下载:https://download.csdn.net/download/H_Dazzling/12028041