之前使用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>
接下来就可以着手写打开摄像通头的程序了。以下是相关代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235// 行人检测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_FILE static char THIS_FILE[] = __FILE__; #endif / // CAboutDlg dialog used for App About class 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 // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_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_MAP END_MESSAGE_MAP() / // CMyDlg dialog CMyDlg::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 Win32 m_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_MAP END_MESSAGE_MAP() / // CMyDlg message handlers BOOL 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 dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return 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 painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int 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 icon dc.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 default pFrame = 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 here camera.CloseCamera(); CDialog::OnOK(); }
头文件
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63// 行人检测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 dialog class CMyDlg : public CDialog { // Construction public: 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 // Implementation protected: 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_MSG DECLARE_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_)
最后
以上就是帅气仙人掌最近收集整理的关于使用DirectShow打开摄像头 MFC编程的全部内容,更多相关使用DirectShow打开摄像头内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复