Opencv +mfc 实现录像
环境
- Opencv版本3.20
- vs2017
主要使用的类
- 使用VideoCapture大开本地摄像头
- 使用VideoWriter写入帧,保存AVI视频文件
功能
- 可以录像,设置录像文件大小
- 可以打开本地视屏文件播放
- 实时显示摄像头视频
关键实现
- 渲染一帧到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);
}
- 运行截图
完整代码工程下载:https://download.csdn.net/download/H_Dazzling/12028041