簡體   English   中英

如何在c#中從網絡攝像頭抓取恆定的位圖圖像流

[英]How to grab constant stream of bitmap images from webcam in c#

我們有ac#應用程序,可以對視頻流進行處理。 這是一個以Bitmap格式接收每個幀的低級應用程序,所以基本上我們每秒需要25個圖像。 此應用程序已經適用於我們的一些媒體源,但我們現在需要添加網絡攝像頭作為輸入設備。

所以我們基本上需要連續捕獲來自網絡攝像頭的位圖圖像,以便我們可以將所有這些幀作為“流”傳遞給我們的應用程序。

訪問網絡攝像頭的最佳和最簡單的方法是什么?直接從網絡攝像頭讀取實際幀作為單獨的圖像? 我還在起跑線上。

有許多庫允許人們訪問網絡攝像頭,在Windows面板上預覽網絡攝像頭的內容,然后使用屏幕捕獲再次捕獲此圖像。 遺憾的是,在每秒捕獲25幀時,這不會給我們提供必要的性能。 IVMRWindowlessControl9 :: GetCurrentImage已被提及作為另一種選擇,但這似乎再次針對的是不常見的快照而不是恆定的圖像流。 Directshow.Net被許多人稱為一個很好的候選人,但目前還不清楚如何簡單地從網絡攝像頭抓取圖像。 此外,許多消息來源表示擔心微軟不再支持Directshow。 此外,我已經看到的實現需要ImageGrabber,顯然也不再支持 MS的新選擇似乎是媒體基金會,但我的研究還沒有找到任何可以實現的實例(我不確定這是否會在XP等舊版本的Windows上運行)。 DirectX.Capture是一個很棒的庫( 參見一個不錯的實現 )但似乎缺少直接獲取視頻圖像的過濾器和方法。 我也開始研究濾鏡和濾鏡圖,但這看起來非常復雜,感覺有點像“重新發明輪子”。

總的來說,上面簡要提到的所有解決方案似乎都相當陳舊。 有人可以指點我一步一步的指導,讓網絡攝像頭在C#中工作,並從中每秒抓取幾張圖像? (我們還必須在某些時候做音頻,因此不排除視頻的解決方案將是最有幫助的)。

我使用AForge.Video(在這里找到它:code.google.com/p/aforge/)因為它是一個非常快速的c#實現。 我對它的表現感到非常滿意,它可以在一台8歲的PC上以30fps的速度輕松捕獲兩個高清網絡攝像頭。 數據作為本機IntPtr提供,因此它非常適合使用本機代碼或opencv進行進一步處理。

opencv包裝器emgu和opencvsharp都實現了基本的視頻捕獲功能,這可能足以滿足您的需要。 很明顯,如果你要進行圖像處理/計算機視覺,你可能還是想要使用它們。

正如dr.mo建議的那樣,Aforge就是答案。

我從這里使用了教程: http//en.code-bude.net/2013/01/02/how-to-easily-record-from-a-webcam-in-c/

在本教程中,每次從網絡攝像頭收到幀時,它們都會觸發事件處理程序。 在原始教程中,此位圖用於將圖像寫入PictureBox。 我只是修改它以將位圖圖像保存到文件而不是圖片框。 所以我已經替換了以下代碼:

pictureBoxVideo.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();

使用以下代碼:

Bitmap myImage = (Bitmap)eventArgs.Frame.Clone();
string strGrabFileName = String.Format("C:\\My_folder\\Snapshot_{0:yyyyMMdd_hhmmss.fff}.bmp", DateTime.Now);            
myImage.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Bmp);

它就像一個魅力!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM