日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于kinect + EmguCV 的监控小应用(视频录制保存)

發布時間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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;}} }
  • 核心代碼 錄制并保存視頻
//錄制視頻private void DispatchVideoRecording(ColorImageFrame colorImageFrame){if (isBodyDetected && null != colorImageFrame){//搞不出來了//byte[] pixel = new byte[_kinect.colorstream.framepixeldatalength];//colorimageframe.copypixeldatato(pixel);//image<rgb, byte> frame = new image<rgb, byte>(colorimageframe.width, colorimageframe.height);//frame.bytes = pixel;VidioArray.Add(colorImageFrame.ToOpenCVImage<Rgb, byte>());} else{VidioArray.Clear();}//錄制視頻if (VidioArray.Count > ClipMaxFrameNum){String fileName = "clip" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi";System.Drawing.Size size = new System.Drawing.Size(640,480);using (VideoWriter vm = new VideoWriter(fileName,30,size, true)){for (int i = 0; i < VidioArray.Count(); i++) {vm.Write(VidioArray[i].Mat);}}VidioArray.Clear();}}

實現邏輯

1、用kinect來識別視野范圍的人體,基于kinect的深度圖,可以確定視野范圍中是否出現了人物,并發出檢測到人體的信號
(當然也可以是其他運動的物體,不過識別人體以外的運動物體要用另外的庫來做,kinect沒有接口可調,例如OpenCv可以用作面部識別,手勢識別,運動物體識別等)

2、打開kinect的彩色圖像流,當收到kinect發出的檢測到人體的信號時,將彩色圖像幀逐幀保存到隊列中(隊列大小為150),kinect目前大概是一秒返回30幀,所以這個隊列幀可以接收5秒的數據,判斷當隊列滿時,將隊列幀數據提取保存成.avi格式的視頻文件,存到磁盤。

3、以上信號在程序中可用全局變量表示,具體見代碼。

4、這樣做可以保證錄制下來的視頻,都是有內容的,不至于一段家庭監控錄像,晚上8小時全是空白,看的也瘆人。

4、基本上就完成了一個自動檢測人體并保存錄像的功能。我準備晚上放到客廳,看看晚上有沒有駭人的事情發生,早上起來看,又是驚喜刺激的一天呢。

總結

以上是生活随笔為你收集整理的基于kinect + EmguCV 的监控小应用(视频录制保存)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。