本文实例为大家分享了C#获取摄像头拍照显示图像的具体代码,供大家参考,具体内容如下
概述
之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。
其实本质就是保存图像二维码,在进行二维码识别。
下面来看看如何实现。
主要代码实现
1、初始化摄像头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/// <summary> /// 初始化摄像头 /// </summary> /// <param name="handle">控件的句柄</param> /// <param name="left">开始显示的左边距</param> /// <param name="top">开始显示的上边距</param> /// <param name="width">要显示的宽度</param> /// <param name="height">要显示的长度</param> public Pick(IntPtr handle, int left, int top, int width, int height) { mControlPtr = handle; mWidth = width; mHeight = height; mLeft = left; mTop = top; } [DllImport( "avicap32.dll" )] private static extern IntPtr capCreateCaptureWindowA( byte [] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID); [DllImport( "avicap32.dll" )] private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize); [DllImport( "User32.dll" )] private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam); |
2、开始显示图像
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
|
/// <summary> /// 开始显示图像 /// </summary> public void Start() { if (bStat) return ; bStat = true ; byte [] lpszName = new byte [100]; hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0); if (hWndC.ToInt32() != 0) { SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); } return ; } |
3、停止显示
1
2
3
4
5
6
7
8
|
/// <summary> /// 停止显示 /// </summary> public void Stop() { SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bStat = false ; } |
4、抓图
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
|
/// <summary> /// 抓图 /// </summary> /// <param name="path">要保存bmp文件的路径</param> public void GrabImage( string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } /// <summary> /// 录像 /// </summary> /// <param name="path">要保存avi文件的路径</param> public void Kinescope( string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64()); SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0); } /// <summary> /// 停止录像 /// </summary> public void StopKinescope() { SendMessage(hWndC, WM_CAP_STOP, 0, 0); } |
完整代码
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
236
237
238
239
240
241
242
243
244
245
246
247
|
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Windows.Forms; using System.Runtime.InteropServices; using com.google.zxing.qrcode.decoder; using com.google.zxing.client; using com.google.zxing.common; using System.Threading; public partial class Decode : System.Web.UI.Page { // public delegate void SaveImg(Pick Pick1); /// <summary> /// 一个控制摄像头的类 /// </summary> public class Pick { private const int WM_USER = 0x400; private const int WS_CHILD = 0x40000000; private const int WS_VISIBLE = 0x10000000; private const int WM_CAP_START = WM_USER; private const int WM_CAP_STOP = WM_CAP_START + 68; private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; private const int WM_CAP_SAVEDIB = WM_CAP_START + 25; private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60; private const int WM_CAP_SEQUENCE = WM_CAP_START + 62; private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20; private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63; private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51; private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50; private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6; private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2; private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3; private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5; private const int WM_CAP_SET_SCALE = WM_CAP_START + 53; private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52; private IntPtr hWndC; private bool bStat = false ; private IntPtr mControlPtr; private int mWidth; private int mHeight; private int mLeft; private int mTop; /// <summary> /// 初始化摄像头 /// </summary> /// <param name="handle">控件的句柄</param> /// <param name="left">开始显示的左边距</param> /// <param name="top">开始显示的上边距</param> /// <param name="width">要显示的宽度</param> /// <param name="height">要显示的长度</param> public Pick(IntPtr handle, int left, int top, int width, int height) { mControlPtr = handle; mWidth = width; mHeight = height; mLeft = left; mTop = top; } [DllImport( "avicap32.dll" )] private static extern IntPtr capCreateCaptureWindowA( byte [] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID); [DllImport( "avicap32.dll" )] private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize); [DllImport( "User32.dll" )] private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam); /// <summary> /// 开始显示图像 /// </summary> public void Start() { if (bStat) return ; bStat = true ; byte [] lpszName = new byte [100]; hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0); if (hWndC.ToInt32() != 0) { SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); } return ; } /// <summary> /// 停止显示 /// </summary> public void Stop() { SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bStat = false ; } /// <summary> /// 抓图 /// </summary> /// <param name="path">要保存bmp文件的路径</param> public void GrabImage( string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } /// <summary> /// 录像 /// </summary> /// <param name="path">要保存avi文件的路径</param> public void Kinescope( string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64()); SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0); } /// <summary> /// 停止录像 /// </summary> public void StopKinescope() { SendMessage(hWndC, WM_CAP_STOP, 0, 0); } } protected void Page_Load( object sender, EventArgs e) { } //void DoInit() //{ // System.Windows.Forms.Form frm = new Form(); // frm.Height = 300; // frm.Width = 300; // System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox(); // Panel.Height = 300; // Panel.Width = 300; // Panel.Visible = true; // Panel.BackgroundImageLayout = ImageLayout.None; // frm.Controls.Add(Panel); // frm.TopMost = true; // Pick p = new Pick(Panel.Handle, 0, 0, 300, 300); // p.Start(); // frm.Show(); // p.Kinescope(Server.MapPath("img\\Decode2.avi")); // p.GrabImage(Server.MapPath("img\\Decode1.bmp")); // p.Stop(); // frm.Close(); // frm.Dispose(); //} private void getQrcode() { try { //ThreadStart worker = new ThreadStart(DoInit); //Thread th = new Thread(worker); //th.IsBackground = true; //th.Start(); System.Windows.Forms.Form frm = new Form(); frm.Height = 300; frm.Width = 300; System.Windows.Forms.PictureBox Panel = new System.Windows.Forms.PictureBox(); Panel.Height = 300; Panel.Width = 300; Panel.Visible = true ; Panel.BackgroundImageLayout = ImageLayout.None; frm.Controls.Add(Panel); frm.TopMost = true ; Pick p = new Pick(Panel.Handle, 0, 0, 300, 300); p.Start(); int i = 1; while (i <= 1) { p.GrabImage(Server.MapPath( "img\\Decode.bmp" )); p.Kinescope(Server.MapPath( "img\\Video.avi" )); i++; } p.Stop(); frm.Close(); frm.Dispose(); try { com.google.zxing.qrcode.QRCodeReader d = new com.google.zxing.qrcode.QRCodeReader(); RGBLuminanceSource rg = new RGBLuminanceSource( new System.Drawing.Bitmap(Server.MapPath( "img\\Decode.bmp" )), new System.Drawing.Bitmap(Server.MapPath( "img\\Decode.bmp" )).Width, new System.Drawing.Bitmap(Server.MapPath( "img\\Decode.bmp" )).Height); com.google.zxing.LuminanceSource ls = rg; HybridBinarizer hb = new HybridBinarizer(ls); com.google.zxing.BinaryBitmap bm = new com.google.zxing.BinaryBitmap(hb); com.google.zxing.Result r = d.decode(bm); TextBox1.Text = r.Text; } catch (Exception ex) { TextBox1.Text = "" ; //MessageBox.Show(ex.Message+"111"); throw new Exception(ex.Message); } } catch (Exception ee) { ee.ToString(); } } protected void Timer1_Tick( object sender, EventArgs e) { //getQrcode(); } protected void Button1_Click( object sender, EventArgs e) { getQrcode(); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sD7O95O/article/details/117608132