??OpenCvSharp也支持獲取攝像頭數(shù)據(jù),不同于之前測試AForge時使用AForge控件顯示攝像頭數(shù)據(jù)流并從中截圖圖片,OpenCvSharp中顯示攝像頭數(shù)據(jù)流需要周期性地從攝像頭中截取圖片并顯示在指定控件中。本文學習C#使用OpenCvSharp從攝像頭獲取圖片的基本方式。
??新建基于.net core的Winform項目,在Nuget包管理器中搜索并安裝OpenCvSharp4和OpenCvSharp4.runtime.win,也可以單獨安裝OpenCvSharp4.Windows。
??使用OpenCvSharp中的相關函數(shù)打開攝像頭需要指定攝像頭編號(int類型),但暫時未找到OpenCvSharp中有什么類或函數(shù)能返回計算機中所有視頻設備的帶編號的設備信息,AForge的FilterInfoCollection類能枚舉視頻輸入設備,但是只有名稱和MonikerString,沒有設備編號。
??百度相關文章,最終在參考文獻4中找到合適的代碼,主要是調用參考文獻5中已經(jīng)封裝好的SystemDeviceEnumerator類獲取本地視頻輸入設備及編號,主要代碼如下(本文測試時將參考文獻5下的所有文件都引用到了項目中,也可以通過Nuget包管理器搜索并安裝Hompus.VideoInputDevices包):
using var sde = new Hompus.VideoInputDevices.SystemDeviceEnumerator();
foreach (var device in sde.ListVideoInputDevice())
{
comboCameras.Items.Add($"{device.Value},{device.Key}");
}
??OpenCvSharp中使用VideoCapture類讀取攝像頭或者視頻文件數(shù)據(jù),如果是攝像頭,則在構造函數(shù)中輸入攝像頭編號,如果是視頻文件,則在構造函數(shù)中輸入視頻文件地址。
??接著調用VideoCapture類的Read函數(shù)獲取一幀圖像,該圖像為Mat類型,需要調用OpenCvSharp.Extensions. BitmapConverter.ToBitmap函數(shù)將其轉換為Bitmap對象后再使用(需要安裝OpenCvSharp.Extensions包),參考文獻2中使用循環(huán)周期性地從攝像頭中獲取圖片并顯示在picturebox控件中,也有文章使用后臺線程周期性地讀取攝像頭后再使用,本文中采用timer組件,定時讀取攝像頭圖片后顯示在picturebox控件中,周期設置為1秒除以攝像頭的幀率(Fps)。
??此種情況下截圖也比較簡單,也是調用Read函數(shù)讀取一幀圖片即可。
??最后調用VideoCapture類的Release函數(shù)關閉攝像頭或視頻文件,再調用Dispose函數(shù)釋放資源。
??代碼比較簡單,在此不再貼出,有興趣的可以查看參考文獻2,下圖為程序運行效果。文章來源:http://www.zghlxwxcb.cn/news/detail-799744.html
參考文獻:
[1]https://github.com/shimat/opencvsharp
[2]https://codeantenna.com/a/JbkU23NeP3
[3]https://blog.csdn.net/qq_26351861/article/details/130370934
[4]https://stackoverflow.com/questions/19258886/how-to-get-a-list-of-available-video-capture-devices/62555468#62555468
[5]https://github.com/eNeRGy164/VideoInputDevices/tree/main文章來源地址http://www.zghlxwxcb.cn/news/detail-799744.html
到了這里,關于測試C#使用OpenCvSharp從攝像頭獲取圖片的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!