基于kinect + EmguCV 的监控小应用(视频录制保存)
kinectMonitor
源碼位置
家庭監控小應用–https://gitee.com/ellecommander/kinecMonitor
介紹
基于kinect的家庭監控系統,主要是為了監控我爸爸是不是趁我上班進我房間,偷我的ukelele拍抖音
使用了計算機視覺庫openCV
軟、硬件架構
-
硬件:
-
kinect(我用的xbox1.0版本,2.0網上資料要多一點,一代很多接口也變了,很難排錯)
-
一臺電腦(配置要好)
-
-
軟件:我用的vs開發,wpf應用
-
開發語言:c#
項目說明
-
openCV是c++編寫的,此項目基于c#開發,用到的庫是emguCV(封裝了openCV),另外還有一個庫叫 openCvSharp也是可以的。
EmguCV的官方網站 EmguCV的官方網站
EmguCV源代碼和安裝包EmguCV源代碼和安裝包
-
每一種類庫都有自己能夠理解的核心圖像模型,在EmguCV中也就是Image<TColor, TDepth>,泛型類型,他實現了Emgu.CV.IImage接口。
本項目用到的一個類EmguImageExtensions,該類作為一個擴展方法實現了我們熟悉的一些影像數據格式和Emgu特定的影像格式之間的轉換。用到這里,主要是為了將kinect中的彩色圖像幀轉換為openCV圖像。網上找的這個有點問題,kinect的圖像幀沒有提供toBitMap方法,可能二代就有了?我大概重新把這個方法代碼了一下,測試通過了,注釋掉了最后一個方法,Image<TColor, TDepth>并沒有實現IImage接口,不曉得怎么改,反正我也用不著,就算了把。
改之后
namespace ImageManipulationExtensionMethods {public static class EmguImageExtensions{// 將kinect中的彩色圖像幀轉換為openCV圖像,這里是我改過的,源碼附在下方,可能版本的不同,自行選擇public static Image<TColor, TDepth> ToOpenCVImage<TColor, TDepth>(this ColorImageFrame image)where TColor : struct, IColorwhere TDepth : new(){byte[] pixels = new byte[image.PixelDataLength];image.CopyPixelDataTo(pixels);Bitmap bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppRgb);//鎖定到系統內存中BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, image.Width, image.Height),ImageLockMode.WriteOnly,bitmap.PixelFormat);//bitmapData.Scan0是指向存放圖像像素的第一個內存地址,即第一個像素點的值,同樣也可以通過bitmap.GetPixel(0, 0)//來獲得。因為計算機屏幕坐標軸是在左上角向右下方延伸的,所以bitmapData.Scan0表示的是左上角第一個像素點//IntPtr:平臺特定的整數類型IntPtr ptr = bitmapData.Scan0;//轉換Marshal.Copy(pixels, 0, ptr, image.PixelDataLength);bitmap.UnlockBits(bitmapData);return new Image<TColor, TDepth>(bitmap);}public static Image<TColor, TDepth> ToOpenCVImage<TColor, TDepth>(this Bitmap bitmap)where TColor : struct, IColorwhere TDepth : new(){return new Image<TColor, TDepth>(bitmap);}//public static System.Windows.Media.Imaging.BitmapSource ToBitmapSource(this IImage image)//{// var source = image.Bitmap.ToBitmapSource();// return source;//}} }原始代碼
namespace ImageManipulationExtensionMethods {public static class EmguImageExtensions{public static Image<TColor, TDepth> ToOpenCVImage<TColor, TDepth>(this ColorImageFrame image)where TColor : struct, IColorwhere TDepth : new(){var bitmap = image.ToBitmap();return new Image<TColor, TDepth>(bitmap);}public static Image<TColor, TDepth> ToOpenCVImage<TColor, TDepth>(this Bitmap bitmap)where TColor : struct, IColorwhere TDepth : new(){return new Image<TColor, TDepth>(bitmap);}public static System.Windows.Media.Imaging.BitmapSource ToBitmapSource(this IImage image){var source = image.Bitmap.ToBitmapSource();return source;}} }- 核心代碼 錄制并保存視頻
實現邏輯
1、用kinect來識別視野范圍的人體,基于kinect的深度圖,可以確定視野范圍中是否出現了人物,并發出檢測到人體的信號
(當然也可以是其他運動的物體,不過識別人體以外的運動物體要用另外的庫來做,kinect沒有接口可調,例如OpenCv可以用作面部識別,手勢識別,運動物體識別等)
2、打開kinect的彩色圖像流,當收到kinect發出的檢測到人體的信號時,將彩色圖像幀逐幀保存到隊列中(隊列大小為150),kinect目前大概是一秒返回30幀,所以這個隊列幀可以接收5秒的數據,判斷當隊列滿時,將隊列幀數據提取保存成.avi格式的視頻文件,存到磁盤。
3、以上信號在程序中可用全局變量表示,具體見代碼。
4、這樣做可以保證錄制下來的視頻,都是有內容的,不至于一段家庭監控錄像,晚上8小時全是空白,看的也瘆人。
4、基本上就完成了一個自動檢測人體并保存錄像的功能。我準備晚上放到客廳,看看晚上有沒有駭人的事情發生,早上起來看,又是驚喜刺激的一天呢。
總結
以上是生活随笔為你收集整理的基于kinect + EmguCV 的监控小应用(视频录制保存)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现自动上传图片_pytho
- 下一篇: ffmpeg 小结