使用DirectShow打开摄像头 MFC编程

来源:互联网 发布:百度云用数据上传慢 编辑:程序博客网 时间:2024/05/16 15:20
之前使用OpenCV 自带的函数打开摄像头,在Win7下无法使用的朋友可以参考一下这篇文章。使用DirectShow可以实现打开多个摄像头。首先从网上下载三个文件:DirectShow、CameraDS.cpp、CameraDS.h其中DirectShow是一个文件夹,没必要下载安装程序,DirectShow里面包含了lib文件与Include头文件。接下来是配置DirectShow,新建一个MFC工程,然后在文件一栏添加CameraDS.cpp与CameraDS.h到工程里,还要在工程的.cpp文件哪里添加DirectShow的头文件。比如

//以下fordirectshow#include "camerads.h" #include <stdio.h> #include <stdarg.h> #include <time.h>

       接下来就可以着手写打开摄像通头的程序了。以下是相关代码:

// 行人检测Dlg.cpp : implementation file//#include "stdafx.h"#include "行人检测.h"#include "行人检测Dlg.h"#include <cv.h>#include <cxcore.h>#include <highgui.h>//以下fordirectshow#include "camerads.h" #include <stdio.h> #include <stdarg.h> #include <time.h> #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_FILE_OPEN, OnFileOpen)ON_WM_TIMER()ON_WM_CANCELMODE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyDlg message handlersBOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small icon// TODO: Add extra initialization herereturn TRUE;  // return TRUE  unless you set the focus to a control}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below//  to draw the icon.  For MFC applications using the document/view model,//  this is automatically done for you by the framework.void CMyDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnFileOpen() {// TODO: Add your control notification handler code here//打开摄像头,指定摄像头0开始,参数2指示是否自动弹出摄像头属性页。  if(!camera.OpenCamera(0)) //false不弹出属性窗,用代码制定宽和高 { fprintf(stderr, "Can not open camera 0.\n");//不成功,if(!0),执行代码 //return -1; }     SetTimer(1,40,NULL);                //每隔一段时间读出一帧视频图像}void CMyDlg::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultpFrame = camera.QueryFrame();  //抓取一帧ShowPicture(IDC_srcp, pFrame);   //显示图像CDialog::OnTimer(nIDEvent);}void CMyDlg::ShowPicture(int nID, IplImage *Image)   //显示图像函数{    CDC *pDC = GetDlgItem(nID)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针    HDC hdc= pDC->GetSafeHdc();                      // 获取设备上下文句柄    CRect rect;// 矩形类    GetDlgItem(nID)->GetClientRect(&rect); //获取box1客户区    CvvImage cimg;//    cimg.CopyOf(Image,1);  //参数1代表通道数,故此ShowPicture(int nID, IplImage *Image)函数只能显示单通道图像    cimg.DrawToHDC(hdc,&rect);//输出图像    ReleaseDC( pDC );    cimg.Destroy();//销毁}void CMyDlg::OnCancelMode() {CDialog::OnCancelMode();// TODO: Add your message handler code here}void CMyDlg::OnOK() {// TODO: Add extra validation herecamera.CloseCamera(); CDialog::OnOK();}
头文件
// 行人检测Dlg.h : header file//#include "cv.h"#include "highgui.h"#include "camerads.h" #if !defined(AFX_DLG_H__A2371946_D45A_470D_A282_28670F9555E9__INCLUDED_)#define AFX_DLG_H__A2371946_D45A_470D_A282_28670F9555E9__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// CMyDlg dialogclass CMyDlg : public CDialog{// Constructionpublic:void ShowPicture(int nID, IplImage *Image);    CCameraDS camera;    //声明IplImage指针   IplImage* pFrame ;CMyDlg(CWnd* pParent = NULL);// standard constructor// Dialog Data//{{AFX_DATA(CMyDlg)enum { IDD = IDD_MY_DIALOG };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMyDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CMyDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnFileOpen();afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnCancelMode();virtual void OnOK();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_DLG_H__A2371946_D45A_470D_A282_28670F9555E9__INCLUDED_)
转自http://m.blog.csdn.net/article/details?id=8668831点击打开链接

0 0
原创粉丝点击