如有雷同,不勝榮幸,若轉載,請注明
最近做項目需要操作攝像頭,在網上百度了很多資料,很多都是C#調用window API 發送SendMessage,實現操作攝像頭,但是C#調用window API的時候因為驅動的問題,總是彈出視頻選擇對話框,讓人很是無語,看到大牛們有的截獲到了window消息,然後模擬點擊確定按鈕,這是在是不敢恭維啊,還有的大牛根據API原型重寫了,至於我是一只IT小小鳥了,然後在繼續百度,找到了一個AForge強大的C#類庫,最後終於搞定了,接下來將我拙劣的代碼部分貼出來,以便同行或者需要的朋友學習交流,
首先用到AForge類庫下載地址:http://www.aforgenet.com/
然後引用AForge,AForge.Controls(這個是控件,可以添加到工具箱中),AForge.Imaging,AForge.Video,AForge.Video.DirectShow;
然後直接上代碼
private FilterInfoCollection videoDevices; private VideoCaptureDevice videoSource; public int selectedDeviceIndex = 0;
下面是獲取設備
public FilterInfoCollection GetDevices() { try { //枚舉所有視頻輸入設備 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count != 0) { LogClass.WriteFile("已找到視頻設備."); return videoDevices; } else return null; } catch (Exception ex) { LogClass.WriteFile("error:沒有找到視頻設備!具體原因:" + ex.Message); return null; } }
選擇設備,然後連接攝像頭
///
/// 連接視頻攝像頭 /// /// /// ///public VideoCaptureDevice VideoConnect(int deviceIndex = 0, int resolutionIndex = 0) { if (videoDevices.Count <= 0) return null; selectedDeviceIndex = deviceIndex; videoSource = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString); return videoSource; }
//抓圖,拍照,單幀 public void GrabBitmap(string path) { if (videoSource == null) return; g_Path = path; videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame); }
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { Bitmap bmp = (Bitmap)eventArgs.Frame.Clone(); string fullPath = path + "temp\\"; if (!Directory.Exists(fullPath)) Directory.CreateDirectory(fullPath); string img = fullPath + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".bmp"; bmp.Save(img);
//如果這裡不寫這個,一會兒會不停的拍照, videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame); }
這樣就完成了操作攝像頭的工作
但是發現一個問題,如果要拍照得到的照片先要處理在保存,這裡就有問題了,所以需要在界面前台中添加控件,醫用AForge.Controls,然後添加到工具箱,然後將VideoSourcePlayer控件拖到窗體中,想要得到單張圖像處理:
Bitmap bmp = videoSourcePlayer1.GetCurrentFrame();
這樣就可以拿來處理了,AForge類庫是非常的強大,這裡只是冰山一角,文章不足之處還請大家多多指正,歡迎提出寶貴意見和建議。謝謝。。。