簡單介紹C#獲取攝像頭拍照顯示影像的方法
導讀 | 這篇文章主要為大家詳細介紹了C#獲取攝像頭拍照顯示影像的方法,文中示例程式碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下 |
本文例項為大家分享了C#獲取攝像頭拍照顯示影像的具體程式碼,供大家參考,具體內容如下
概述
之前有個需求,就是在web介面可以實現呼叫攝像頭,使用者把手機的個人二維碼展示給攝像頭,攝像頭進行攝像識別使用者。
其實本質就是儲存影像二維碼,在進行二維碼識別。
下面來看看如何實現。
主要程式碼實現
1、初始化攝像頭
/// < summary> /// 初始化攝像頭 /// < /summary> /// < param name="handle">控制元件的控制程式碼 /// < param name="left">開始顯示的左邊距 /// < param name="top">開始顯示的上邊距 /// < param name="width">要顯示的寬度 /// < param name="height">要顯示的長度 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、開始顯示影像
/// < 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、停止顯示
/// < summary> /// 停止顯示 /// < /summary> public void Stop() { SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bStat = false; }
4、抓圖
/// < summary> /// 抓圖 /// < /summary> /// < param name="path">要儲存bmp檔案的路徑 public void GrabImage(string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } /// < summary> /// 錄影 /// < /summary> /// < param name="path">要儲存avi檔案的路徑 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); }
完整程式碼
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 name="left">開始顯示的左邊距 /// < param name="top">開始顯示的上邊距 /// < param name="width">要顯示的寬度 /// < param name="height">要顯示的長度 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檔案的路徑 public void GrabImage(string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64()); } /// < summary> /// 錄影 /// < /summary> /// < param name="path">要儲存avi檔案的路徑 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(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2886320/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單介紹C#呼叫USB攝像頭的方法C#
- Android呼叫攝像頭拍照並顯示照片Android
- 在Android中呼叫攝像頭拍照並顯示出來Android
- Android提供的攝像頭拍照Android
- Android呼叫攝像頭拍照Android
- 安卓呼叫攝像頭拍照安卓
- Nebulosity 4 for Mac(攝像頭影像捕獲工具)Mac
- UVC攝像頭按鍵拍照功能
- 簡單介紹四種Python 列表反轉顯示的方法Python
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- 照片系列之android呼叫攝像頭拍照Android
- Unity 3d UI獲取外部攝像頭拍攝Unity3DUI
- android studio之簡單呼叫攝像頭並且獲取其照片Android
- HSmartWindowControl 之 攝像頭實時顯示( 使用 WPF )
- WebRTC從攝像頭獲取圖片傳入canvasWebCanvas
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- 簡單介紹Pytorch實現WGAN用於動漫頭像生成PyTorch
- Caffeine快取的簡單介紹快取
- HTML5獲取圖片的原始高度簡單介紹HTML
- 純JavaScript實現的呼叫裝置攝像頭並拍照的功能JavaScript
- iPhone XS/iPhone XS Max攝像頭拍照解析:蘋果也玩起了AI拍照iPhone蘋果AI
- Python基於opencv呼叫攝像頭獲取個人圖片PythonOpenCV
- web呼叫攝像頭拍照並上傳到伺服器Web伺服器
- Camera開發系列之一 顯示攝像頭實時畫面
- Android 圓形頭像 相簿和拍照裁剪選取Android
- python版opencv:如何用筆記本攝像頭拍照儲存PythonOpenCV筆記
- 仿釘釘頭像(有頭像顯示圖片拼接,無圖顯示暱稱)
- opencv python 從攝像頭獲取視訊/從檔案獲取視訊 /儲存視訊OpenCVPython
- 簡單介紹NMS的實現方法
- 簡單介紹PostgreSQL解析URL的方法SQL
- 簡單介紹oracle重置序列的方法Oracle
- 簡單介紹java中的equals()方法Java
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- windows10攝像頭怎麼開啟_window10怎麼開啟攝像頭的方法Windows
- 如何在SAP UI5應用裡新增使用攝像頭拍照的功能UI
- CSRF簡單介紹及利用方法
- Win10專業版攝像頭在哪裡開啟 windows10攝像頭開啟的方法Win10Windows