mfc通过opencv显示摄像头_第1页
mfc通过opencv显示摄像头_第2页
mfc通过opencv显示摄像头_第3页
mfc通过opencv显示摄像头_第4页
mfc通过opencv显示摄像头_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在 MFC 中通过 opencv 显示摄像头视频或者文件视频 分类: c+ 2012-03-16 14:56 15136 人阅读 评论(75) 收藏 举报 mfcinitializationwizardapplicationnullsystem 这里通过 MFC 显示摄像头视频,同样要用到 CvvImage 类,本人用的 opencv2.3.1 的版 本,这里没有这个类,所以仍然需要手动加入这个类的头文件和代码文件。 关于 CvvImage 类的说明请看: /weixingstudio/article/details/7357651 /weixingstudio/article/details/7357558 然后就是搭建工程了。这里就不多说界面的设计了。我这里的界面如图所示,有一个开始 打开摄像头的按钮,一个关闭摄像头的按钮。有一个 PictureBox 的控件。 为了能够在 PictureBox 里面显示图片,我们需要定义一些变量来获取 PictureBox 的句柄。 在主窗口的 cpp 文件中,添加如下的全局变量: cpp view plaincopyprint? 1. CvCapture* capture; 2. CRect rect; 3. CDC *pDC; 4. HDC hDC; 5. CWnd *pwnd; 这里特别注意,这些变量一定要是全局变量。再来看一下这些变量的添加位置: cpp view plaincopyprint? 1. #include “stdafx.h“ 2. #include “VideoMFC.h“ 3. #include “VideoMFCDlg.h“ 4. #include “afxdialogex.h“ 5. 6. #ifdef _DEBUG 7. #define new DEBUG_NEW 8. #endif 9. 10. 11. CvCapture* capture; 12. CRect rect; 13. CDC *pDC; 14. HDC hDC; 15. CWnd *pwnd; 16. 17. / CAboutDlg dialog used for App About 18. 19. class CAboutDlg : public CDialogEx 20. 21. public: 然后在窗口的初始化函数中进行句柄的初始化: cpp view plaincopyprint? 1. OnInitDialog() 这个函数,BOOL CVideoMFCDlg:OnInitDialog() 初始化代码: cpp view plaincopyprint? 1. / CVideoMFCDlg message handlers 2. 3. BOOL CVideoMFCDlg:OnInitDialog() 4. 5. CDialogEx:OnInitDialog(); 6. 7. / Add “About.“ menu item to system menu. 8. 9. / IDM_ABOUTBOX must be in the system command range. 10. ASSERT(IDM_ABOUTBOX 11. ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); 23. pSysMenu- AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 24. 25. 26. 27. 28. / Set the icon for this dialog. The framework does this automatical ly 29. / when the applications main window is not a dialog 30. SetIcon(m_hIcon, TRUE); / Set big icon 31. SetIcon(m_hIcon, FALSE); / Set small icon 32. 33. / TODO: Add extra initialization here 34. pwnd = GetDlgItem(IDC_ShowImage); 35. /pwnd-MoveWindow(35,30,352,288); 36. pDC =pwnd-GetDC(); 37. /pDC =GetDC(); 38. hDC= pDC-GetSafeHdc(); 39. pwnd-GetClientRect( 40. 41. 42. 43. return TRUE; / return TRUE unless you set the focus to a control 44. 这里的初始化代码只有 Todo 后面的是自己添加的,目的是获得图像控件的句柄,将来好 在上面显示图像。这一步也可以放在具体的显示图像的时候在进行,但是就需要每显示一 帧,都获得一次句柄。 在控制台程序中,我们可以很简单的通过 for(;)的空循环来不停的实现获取摄像头的每一 帧,但是我发现这么做在 MFC 里面是不可行的。一个是因为 MFC 是用户界面程序,如果 这么写的话,所有的界面都会卡住,而且这么写的话其他的功能按钮就失去作用了。 这里为了实现获取摄像头的每一帧,我们要通过设定一个时间事件,让每隔一定时间,比 如 20ms,就调用一个函数,通过这个时间调用来获取摄像头的帧。 这样,我们就可以实现在图像控件中显示视频,并且用户界面不会卡住了。 看一下打开摄像头按钮的代码: cpp view plaincopyprint? 1. void CVideoMFCDlg:OnBnClickedButton1() 2. 3. / TODO: Add your control notification handler code here 4. /AfxMessageBox(“OK“); 5. if(!capture) 6. 7. capture = cvCaptureFromCAM(0); 8. /AfxMessageBox(“OK“); 9. 10. 11. if (!capture) 12. 13. AfxMessageBox(“无法打开摄像头“); 14. return; 15. 16. 17. / 测试 18. IplImage* m_Frame; 19. m_Frame=cvQueryFrame(capture); 20. CvvImage m_CvvImage; 21. m_CvvImage.CopyOf(m_Frame,1); 22. if (true) 23. 24. m_CvvImage.DrawToHDC(hDC, 25. /cvWaitKey(10); 26. 27. 28. / 设置计时器,每 10ms 触发一次事件 29. SetTimer(1,10,NULL); 30. 这里有一个 SetTimer();函数,这个函数就是调用 win32 函数实现每隔指定的时间调用一次 我们指定的事件。这个函数有两种用法,一种是指定一个回调函数,一个是通过 MFC 的 ClassWizard 指定的回调函数。 SetTimer()的具体用法请见: /view/998104.htm 这里我们使用了通过 MFC 的 ClassWizard 设定回调函数。 在 VS 中,用户界面设计右击打开 Class Wizard, 切换到 Message 选项卡,然后找到 WM_TIMER 这个 message, 双击右边的 OnTimer 句柄,然后进入回调函数的代码。 回调函数的代码如下: cpp view plaincopyprint? 1. void CVideoMFCDlg:OnTimer(UINT_PTR nIDEvent) 2. 3. / TODO: Add your message handler code here and/or call default 4. /* */ 5. /* 显示摄像头 */ 6. /* */ 7. IplImage* m_Frame; 8. m_Frame=cvQueryFrame(capture); 9. CvvImage m_CvvImage; 10. m_CvvImage.CopyOf(m_Frame,1); 11. if (true) 12. 13. m_CvvImage.DrawToHDC(hDC, 14. /cvWaitKey(10); 15. 16. 17. CDialogEx:OnTimer(nIDEvent); 18. 关闭摄像头代码: cpp view plaincopyprint? 1. void CVideoMFCDlg:OnBnClickedButton2() 2. 3. / TODO: Add your control notification handler code here 4. cvReleaseCapture( 5. CDC MemDC; 6. CBitmap m_Bitmap1; 7. m_Bitmap1.LoadBitmap(IDB_BITMAP1); 8. MemDC.CreateCompatibleDC(NULL); 9. MemDC.SelectObject( 10. pDC- StretchBlt(rect.left,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论