作者:jink2005
此文原位于本坛文章“MFC多线程编程:问题的提出与解决方案”的第二贴中,为了方便OpenCV的学习者,重新复制于此。
原理请见:http://www.aiseminar.cn/bbs/viewthread.php?tid=338&page=1&fromuid=3#pid583
根据上面介绍我的程序应该使用工作者线程,完成后,视频可以实施预览,拍照按钮可以响应,并拍照。注意下面程序中m_video是对应显示视频的空间的Control变量。
实现效果如下:
多线程实现代码:
- // AISeminarVTDlg.h : header file
- class CAISeminarVTDlg : public CDialog
- {
- // Construction
- public:
- CAISeminarVTDlg(CWnd* pParent = NULL); // standard constructor
- CWinThread* pThread; // 新加代码
- // ……
- protected:
- HICON m_hIcon;
- // ……
- };
- // AISeminarVTDlg.cpp : implementation file
- // ……添加下面代码
- // 声明IplImage指针
- IplImage* pFrame;
- IplImage* pFrImg;
- IplImage* pBkImg;
- // 声明摄像头图像采集对象
- CvCapture* pCapture;
- int nFrmNum;
- UINT previewVideo(LPVOID lpParam);
- // 启动摄像头按钮事件处理:线程调用部分
- void CAISeminarVTDlg::OnBtnDvstart()
- {
- // TODO: Add your control notification handler code here
- UpdateData(true);
- if (! pCapture)
- {
- if (! (pCapture = cvCaptureFromCAM(0)))
- {
- MessageBox("找不到可用摄像头,请接入!");
- return;
- }
- }
- pThread = AfxBeginThread(previewVideo, &m_video);
- MessageBox("摄像头已启动!");
- }
- // ……
- // 多线程函数实现
- UINT previewVideo(LPVOID lpParam)
- {
- // CWnd *video = (CWnd *)GetDlgItem(IDC_VIDEO);
- CStatic *video = (CStatic *)lpParam;
- CDC *pDC = video->GetDC();
- HDC hDC = pDC->GetSafeHdc();
- CRect rect;
- video->GetClientRect(&rect);
- CvvImage img;
- while (pFrame = cvQueryFrame(pCapture))
- {
- nFrmNum ++;
- img.CopyOf(pFrame);
- img.DrawToHDC(hDC, &rect);
-
- }
- // ReleaseDC(pDC);
- return 0;
- }