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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kinect深度图像滤波

發(fā)布時(shí)間:2025/7/25 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kinect深度图像滤波 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

from:Kinect深度圖像濾波

最近在做機(jī)器視覺方面的一點(diǎn)工作,用Kinect作sensor獲取深度數(shù)據(jù)、顏色、手勢(shì)識(shí)別等。非常感激CNBlog上的兩篇博文:(1)獨(dú)釣寒江的http://www.cnblogs.com/yangecnu/archive/2012/03/30/KinectSDK_Geting_Started.html 從中學(xué)到了不少關(guān)于在WPF平臺(tái)上使用C#,利用微軟Kinect SDK開發(fā)自己的應(yīng)用程序的知識(shí),給了我很大的幫助,在此表示感謝!

但是博主獨(dú)釣寒江的博文中,針對(duì)深度圖像濾波,只簡(jiǎn)要說了取反和用Bgr32表示深度圖像,效果不是很理想。

后來,發(fā)現(xiàn)了另一篇博文(2)何文西的http://www.cnblogs.com/TravelingLight/archive/2012/05/25/2517680.html介紹了國(guó)外的一篇文章,上面介紹了外國(guó)作者自己開發(fā)的兩種濾波方法:像素濾波法,加權(quán)移動(dòng)平均法。效果很好!可惜只有代碼片段無法試驗(yàn),而且濾波算法不是特別容易理解。實(shí)在可惜!

前幾天偶然跟蹤并找到了作者的源代碼http://kinectdepthsmoothing.codeplex.com/,下載來看。運(yùn)行發(fā)現(xiàn),程序要求:VS2012以上、Kinect SDK 1.7以上版本,而根據(jù)獨(dú)釣寒江的博文指導(dǎo),其中的代碼用的是SDK 1.0,進(jìn)一步發(fā)現(xiàn)其中的一些API函數(shù),數(shù)據(jù)類型都不相同,再者,Kinectdepthsmoothing中xaml代碼用的是后臺(tái)創(chuàng)建,而獨(dú)釣寒江的博文中xaml用的是布局式,而我對(duì)xaml又不懂,如何把這兩個(gè)程序結(jié)合起來呢?

由于獨(dú)釣寒江的博文給出的程序中,有大量的功能實(shí)現(xiàn),比如保存圖像、鼠標(biāo)單擊顯示像素深度值、彩色渲染、人體尺寸獲取,游戲者索引等等,而外國(guó)朋友的kinectdepthsmoothing程序只有濾波和保存圖像,那么考慮把濾波模塊移植到獨(dú)釣寒江的程序中,并且不改變?cè)瓉淼牟季质浇缑妗T谝浦驳倪^程中,主要解決了以下幾個(gè)類型不兼容的問題:

a) 將short[] pixelData類型改成DepthImagePixel[] pixelData,這里注意:SDK 1.8版本中,private DepthImagePixel[] depthPixels;其中獲取深度數(shù)據(jù)為

?1 short depth=depthPixels[i].Depth; ?

而SKD 1.0版本中,short[] pixelData獲取深度數(shù)據(jù)的方式為

?1 Int32 depth =this.depthPixels[pIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;?

需要進(jìn)行移位操作。而且兩種方式的depth類型不一樣,一個(gè)是short16位,一個(gè)是Int32位。

b) 用三通道Bgr32格式的colorBitmap存儲(chǔ)深度圖像,而不是Gray16格式的depthBitmap。除了深度數(shù)組的格式不一樣之外,外國(guó)朋友的程序中,有這樣幾行代碼值得關(guān)注,

?

1 //獲得當(dāng)前幀最大和最小可用的深度值 2 short minDepth = (short)lastDepthFrame.MinDepth; 3 short maxDepth = (short)lastDepthFrame.MaxDepth;

以及

1 //在這里將depthPixels數(shù)組中的深度值,逐元素,轉(zhuǎn)換并存儲(chǔ)到colorPixles中 2 3 //最后,將colorPixels寫入colorBitmap中 4 5 int colorPixelIndex = 0; 6 7 for (int i = 0; i < depthPixels.Length; i++) 8 9 { 10 11 //獲取該元素(點(diǎn))的深度值 12 13 short depth = depthPixels[i].Depth; 14 15 byte intensity = (byte)255; 16 17 int newMax = depth - minDepth; 18 19 if (newMax > 0) 20 21 {intensity = (byte)(255 - (255 * newMax / (3150))); } 22 23 this.colorPixels[colorPixelIndex++] = intensity;//blue 24 25 this.colorPixels[colorPixelIndex++] = intensity;//green 26 27 this.colorPixels[colorPixelIndex++] = intensity;//red 28 29 ++colorPixelIndex; 30 }

??最后將數(shù)據(jù)寫入colorBitmap時(shí),代碼為

1 2 3 4 5 this.colorBitmap.WritePixels( ???????newInt32Rect(0, 0, this.colorBitmap.PixelWidth,this.colorBitmap.PixelHeight), ???????this.colorPixels, ???????this.colorBitmap.PixelWidth *sizeof(int), ???????0);

??使用了?this.colorBitmap.PixelWidth這個(gè)寫法,而不是獨(dú)釣寒江博主的程序中,使用depthStream.FrameHeight創(chuàng)建圖像的矩形區(qū)域this.depthRect = new Int32Rect(0, 0, depthStream.FrameWidth, depthStream.FrameHeight);

c) 此外,初始化變量(數(shù)據(jù)容器depthPixels和colorPixels)時(shí),要注意colorPixels的大小

1 this.depthPixels = new DepthImagePixel[depthStream.FramePixelDataLength]; 2 this.colorPixels = new byte[depthStream.FramePixelDataLength * sizeof(int)];

總之,將兩個(gè)程序結(jié)合起來,要注意兩個(gè)方面,一是界面的形式,布局還是后臺(tái)創(chuàng)建,二是,.cs程序中由于使用的SDK版本不同,有很多API和數(shù)據(jù)類型不一致的地方,需要修改。由于正在做后續(xù)的實(shí)驗(yàn),比如加入了自己的利用深度數(shù)據(jù)進(jìn)行邊緣檢測(cè)的代碼,還有很多想法沒有實(shí)現(xiàn),暫時(shí)寫到這里吧。到時(shí)候會(huì)將完整代碼上傳到網(wǎng)絡(luò)上,供大家參考!謝謝。

下篇文章將介紹基于深度值的目標(biāo)分割,并附上完整代碼。

總結(jié)

以上是生活随笔為你收集整理的Kinect深度图像滤波的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。