《2022年MFC通过opencv显示摄像头 .pdf》由会员分享,可在线阅读,更多相关《2022年MFC通过opencv显示摄像头 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在 MFC 中通过 opencv显示摄像头视频或者文件视频分类:c+ 2012-03-16 14:56 15136人阅读评论 (75) 收藏举报mfcinitializationwizardapplicationnullsystem这里通过 MFC 显示摄像头视频, 同样要用到CvvImage类, 本人用的 opencv2.3.1的版本,这里没有这个类,所以仍然需要手动加入这个类的头文件和代码文件。关于 CvvImage类的说明请看:http:/ 文件中,添加如下的全局变量:cppview plaincopyprint?名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
2、- - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 1.CvCapture* capture; 2.CRect rect; 3.CDC *pDC; 4.HDC hDC; 5.CWnd *pwnd; 这里特别注意,这些变量一定要是全局变量。再来看一下这些变量的添加位置:cppview plaincopyprint?1.#include stdafx.h 2.#include VideoMFC.h 3.#include VideoMFCDlg.h 4.#include afxdialogex.h 5.6.#i
3、fdef _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: 然后在窗口的初始化函数中进行句柄的初始化:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
4、- - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - cppview plaincopyprint?1.OnInitDialog() 这个函数, BOOL CVideoMFCDlg:OnInitDialog() 初始化代码:cppview plaincopyprint?1./ CVideoMFCDlg message handlers 2.3.BOOL CVideoMFCDlg:OnInitDialog() 4. 5. CDialogEx:OnInitDialog(); 6.7. / Add About. menu item to s
5、ystem menu. 8.9. / IDM_ABOUTBOX must be in the system command range. 10. ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX); 11. ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); 23. pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 24. 25. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
6、名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 26.27.28. / Set the icon for this dialog. The framework does this automatically 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
7、 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(&rect); 40.41.42.43. return TRUE; / return TRUE unless you set the focus to a control 44. 这里的初始化代码只有Todo 后面的是自己添
8、加的,目的是获得图像控件的句柄,将来好在上面显示图像。这一步也可以放在具体的显示图像的时候在进行,但是就需要每显示一帧,都获得一次句柄。在控制台程序中, 我们可以很简单的通过for(;) 的空循环来不停的实现获取摄像头的每一帧,但是我发现这么做在MFC 里面是不可行的。一个是因为MFC 是用户界面程序,如果这么写的话,所有的界面都会卡住,而且这么写的话其他的功能按钮就失去作用了。这里为了实现获取摄像头的每一帧,我们要通过设定一个时间事件,让每隔一定时间,比如20ms, 就调用一个函数,通过这个时间调用来获取摄像头的帧。这样,我们就可以实现在图像控件中显示视频,并且用户界面不会卡住了。看一下打开
9、摄像头按钮的代码:cppview plaincopyprint?1.void CVideoMFCDlg:OnBnClickedButton1() 2. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 3. / TODO: Add your control notification handler code here 4. /AfxMessageBox(OK); 5. if(!capture) 6. 7. capture = cv
10、CaptureFromCAM(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, &rect); 2
11、5. /cvWaitKey(10); 26. 27.28. / 设置计时器 , 每 10ms 触发一次事件29. SetTimer(1,10,NULL); 30. 这里有一个SetTimer(); 函数,这个函数就是调用win32 函数实现每隔指定的时间调用一次我们指定的事件。这个函数有两种用法,一种是指定一个回调函数,一个是通过MFC 的ClassWizard指定的回调函数。SetTimer() 的具体用法请见:http:/ 的 ClassWizard设定回调函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
12、- - - - - - - 第 5 页,共 8 页 - - - - - - - - - 在 VS 中,用户界面设计右击打开Class Wizard, 切换到 Message选项卡,然后找到WM_TIMER这个 message, 双击右边的OnTimer 句柄,然后进入回调函数的代码。回调函数的代码如下:cppview plaincopyprint?1.void CVideoMFCDlg:OnTimer(UINT_PTR nIDEvent) 2. 3. / TODO: Add your message handler code here and/or call default 4. /*/ 5.
13、 /* 显示摄像头 */ 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, &rect); 14. /cvWaitKey(10); 15. 16.17. CDialogEx:OnTimer(nIDEvent); 18. 关闭摄像头代码:cppview plaincopyprint?1.void CVideoMF
14、CDlg:OnBnClickedButton2() 2. 3. / TODO: Add your control notification handler code here 4. cvReleaseCapture(&capture); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 5. CDC MemDC; 6. CBitmap m_Bitmap1; 7. m_Bitmap1.LoadBitmap(IDB_BITMAP1);
15、 8. MemDC.CreateCompatibleDC(NULL); 9. MemDC.SelectObject(&m_Bitmap1); 10. pDC-StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,48,48,SRCCOPY); 11. 系统运行截图:如果需要保存摄像头视屏的操作,请看链接中的文章:http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 整个工程的下载地址:http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -