生活随笔
收集整理的這篇文章主要介紹了
OpenCV单kinect多帧静止场景的深度图像去噪
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
from: OpenCV單kinect多幀靜止場景的深度圖像去噪
老板kinect去噪的任務下達已經有半個多月了,前期除了看了幾天文獻之外就打醬油了,好像每天都很忙,可是就是不知道在忙什么。這幾天為了交差,就胡亂湊了幾段代碼,得到一個結果,也知道不行,先應付一下,再圖打算。
程序思想很簡單,先對靜止的場景連續采樣若干幀,然后對所有點在時間域取中值,對取完中值之后的無效點在空間域取最近鄰,勉強將黑窟窿填上了。由于代碼較長,現在奉上關鍵的幾個片段:
[cpp] view plain
copy #include<cv.h>??#include<highgui.h>??#include<iostream>??using?namespace?std;????#ifndef?_DENOISE??#define?_DENOISE????const?int?nFrames?=?9;?????const?int?width?=?640;?????const?int?height?=?480;??????class?kinectDenoising??{??private:?????????????????????????????IplImage*?denoisedImage;??????IplImage*?frameSet[nFrames];??????unsigned?int?numOfFrames;??????CvRect?imageROI;??public:??????kinectDenoising();??????~kinectDenoising();??????void?addFrame(IplImage*?img);???????void?setImageROI(bool?isUpdate?=?true);??????void?medianFiltering();???????void?nearestFiltering();??????void?updateFrameSet(IplImage*?img);??????void?showDenoiedImage(const?char*?window);??????void?showCurrentImage(const?char*?window);??};????void?insertSort(unsigned?short*?data,int&?len,unsigned?short?newData);????#endif?? 這是定義的頭文件,裝模作樣的寫了一個類,在構造函數里面,除了對denoisedImage分配內存之外其他都置0,析構函數需要釋放denoisedImage和frameSet數組的內存。numOfFrames本來設計為frameSet中的圖像的幀數,結果由于偷懶就用了一個定長的數組。
[cpp] view plain
copy void?kinectDenoising::setImageROI(bool?isUpdate)??{??????if(!isUpdate)???????{??????????imageROI?=?cvRect(22,44,591,434);??????}??????else??????{??????????IplImage*?image8u?=?cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);??????????IplImage*?bitImage?=?cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);??????????????????????cvConvertScale(frameSet[0],image8u,255.0/4096.0);??????????cvThreshold(image8u,bitImage,0,1,CV_THRESH_BINARY);??????????????????????????????????????????CvMat*?rowReduced?=?cvCreateMat(1,bitImage->width,CV_32FC1);????????????????????CvMat*?colReduced?=?cvCreateMat(bitImage->height,1,CV_32FC1);????????????cvReduce(bitImage,rowReduced,0,CV_REDUCE_SUM);??????????cvReduce(bitImage,colReduced,1,CV_REDUCE_SUM);??????????????????????for(int?i=0;i<rowReduced->cols;i++)??????????{??????????????float?temp?=?CV_MAT_ELEM(*rowReduced,float,0,i);??????????????if(temp>bitImage->height/3)??????????????{??????????????????imageROI.x?=?i;??????????????????break;??????????????}??????????}??????????????????????for(int?i=rowReduced->cols;i>0;i--)??????????{??????????????float?temp?=?CV_MAT_ELEM(*rowReduced,float,0,i-1);??????????????if(temp>bitImage->height/3)??????????????{??????????????????imageROI.width?=?i-imageROI.x;??????????????????break;??????????????}??????????}??????????????????????for(int?i=0;i<colReduced->rows;i++)??????????{??????????????float?temp?=?CV_MAT_ELEM(*colReduced,float,i,0);??????????????if(temp>bitImage->height/3)??????????????{??????????????????imageROI.y?=?i;??????????????????break;??????????????}??????????}??????????????????????for(int?i=colReduced->rows;i>0;i--)??????????{??????????????float?temp?=?CV_MAT_ELEM(*colReduced,float,i-1,0);??????????????if(temp>bitImage->height/3)??????????????{??????????????????imageROI.height?=?i-imageROI.y;??????????????????break;??????????????}??????????}??????????????????????cvReleaseImage(&bitImage);??????????cvReleaseImage(&image8u);??????????cvReleaseMat(&rowReduced);??????????cvReleaseMat(&colReduced);??????}??}?? 這是計算深度圖像的濾波范圍。由于深度圖像和彩色圖像的視點不一致,導致了將深度圖像映射到彩色圖像上時有效像素會縮小,典型的現象就是在深度圖像的四周會出現黑色的區域。這個函數就是用來將四周的黑色框框去掉。用OpenCV的投影的方法。由于cvReduce()函數要進行累積和的計算,為了不使數據溢出,目標數組應該用32位的浮點型(此函數只支持8位unsigned char型和32位float型)。
[cpp] view plain
copy void?kinectDenoising::medianFiltering()??{????????????cvSetZero(denoisedImage);????????unsigned?short?data[nFrames];??????int?total;??????for(int?i=imageROI.y;i<imageROI.y+imageROI.height;i++)??????{??????????unsigned?short*?denoisedImageData?=?(unsigned?short*)(denoisedImage->imageData+denoisedImage->widthStep*i);??????????for(int?j=imageROI.x;j<imageROI.x+imageROI.width;j++)??????????{??????????????total?=?0;??????????????for(int?k=0;k<nFrames;k++)??????????????{??????????????????insertSort(data,total,CV_IMAGE_ELEM(frameSet[k],unsigned?short,i,j));??????????????}??????????????if(total?!=?0)??????????????{??????????????????denoisedImageData[j]?=?data[total/2];??????????????}??????????}??????}??}?? 中值濾波,統計有效點并排序,然后取中值。insertSort()函數用來將值按從小到大的順序進行插入,鑒于篇幅的關系,就不貼出來了。
[cpp] view plain
copy void?kinectDenoising::nearestFiltering()??{??????CvPoint?topLeft,downRight;??????IplImage*?tempImage?=?cvCloneImage(denoisedImage);??????for(int?i=imageROI.y;i<imageROI.y+imageROI.height;i++)??????{??????????unsigned?short*?data?=?(unsigned?short*)(denoisedImage->imageData+denoisedImage->widthStep*i);??????????for(int?j=imageROI.x;j<imageROI.x+imageROI.width;j++)??????????{??????????????for(int?k=1;data[j]==0;k++)??????????????{??????????????????topLeft?=?cvPoint(j-k,i-k);??????????????????????downRight?=?cvPoint(j+k,i+k);??????????????????for(int?m=topLeft.x;(m<=downRight.x)?&&?(data[j]==0);m++)??????????????????{??????????????????????if(m<0)?continue;??????????????????????if(m>=width)?break;??????????????????????if(topLeft.y>=0)??????????????????????{??????????????????????????unsigned?short?temp?=?CV_IMAGE_ELEM(tempImage,unsigned?short,topLeft.y,m);??????????????????????????if(temp?>?0)??????????????????????????{??????????????????????????????data[j]?=?temp;??????????????????????????????break;??????????????????????????}??????????????????????}??????????????????????if(downRight.y?<?height)??????????????????????{??????????????????????????unsigned?short?temp?=?CV_IMAGE_ELEM(tempImage,unsigned?short,downRight.y,m);??????????????????????????if(temp?>?0)??????????????????????????{??????????????????????????????data[j]?=?temp;??????????????????????????????break;??????????????????????????}??????????????????????}?????????????????????????????????????}????????????????????for(int?m=topLeft.y;(m<downRight.y)?&&?(data[j]==0);m++)??????????????????{??????????????????????if(m<0)?continue;??????????????????????if(m>=height)?break;??????????????????????if(topLeft.x>0)??????????????????????{??????????????????????????unsigned?short?temp?=?CV_IMAGE_ELEM(tempImage,unsigned?short,m,topLeft.x);??????????????????????????if(temp?>?0)??????????????????????????{??????????????????????????????data[j]?=?temp;??????????????????????????????break;??????????????????????????}??????????????????????}????????????????????????if(downRight.x<width)??????????????????????{??????????????????????????unsigned?short?temp?=?CV_IMAGE_ELEM(tempImage,unsigned?short,m,downRight.x);??????????????????????????if(temp?>?0)??????????????????????????{??????????????????????????????data[j]?=?temp;??????????????????????????????break;??????????????????????????}??????????????????????}??????????????????}??????????????}??????????}??????}??????cvReleaseImage(&tempImage);??}?? 最后是中值濾波,從最內層開始,一層層往外擴,直到找到有效值為止。
運行結果:
源圖像:
結果圖像:
附注:本來這個程序是在8位圖像上進行的。先取得16位的unsigned short型深度圖像,然后通過cvConvertScale()函數將其轉化為8位的unsigned char型,結果在進行去噪的時候怎么都不對,將unsigned char型的數據放到matlab中一看,發現在unsigned short型數據中為0值的像素莫名其妙的在unsigned char型里有了一個很小的值(比如說1, 2, 3, 4, 5什么的,就是不為0)。很奇怪,不知道OpenCV中是怎么搞的。看來還是源數據靠譜,于是將其改為16位的unsigned short型,結果形勢一片大好。
http://blog.csdn.net/chenli2010/article/details/7006573
-
dafu6693
2017-08-21 19:54 9樓 - 博主,最后的意思是不用轉換圖像的類型,是嗎?
-
-
dafu6693
2017-07-21 10:16 8樓 - 一直圖片加載失敗!!!
-
-
dafu6693
2017-07-20 21:28 7樓 - 你好 ,我想問一下是要輸入多張同一場景的圖片嗎?
-
相關文章推薦
自適應中值濾波(基于C++和OpenCV)Kinect深度圖
自適應中值濾波(基于C++和OpenCV)Kinect深度圖 - kh1445291129
- 2015年04月02日 23:19
- 2198
opencv學習(7)圖像的各種濾波函數的介紹
圖像的濾波目的有兩個: 一是抽出圖像的特征作為圖像識別的特征模式; 另一個是為適應圖像處理的要求,消除圖像數字化時所混入的噪聲; 1、圖像的平滑處理: 平滑濾波是指低頻增強的空間濾... - qq_29828623
- 2016年08月03日 15:43
- 1758
程序員不追趕AI,會被淘汰嗎?
燃爆!人工智能薪酬從起步2萬到漲到3萬,這種背景下,我該轉型AI嗎?未來會不會淘汰?這篇文章可以啟發給所有的程序員... OpenNI+OpenCV對Kinect采集的彩色圖和深度圖進行濾波
平臺:Windows 7 x86,OpenCV2.4.9,OpenNI1.5.4.0,VS2010??????? 采用了4種方式對彩色圖和深度圖進行濾波,分別為均值濾波、高斯濾波、中值濾波和雙邊濾波... - kh1445291129
- 2015年03月23日 23:16
- 1784
opencv 圖像去噪學習總結
OpenCV圖像處理篇之圖像平滑圖像平滑算法程序分析及結果圖像平滑算法圖像平滑與圖像模糊是同一概念,主要用于圖像的去噪。平滑要使用濾波器,為不改變圖像的相位信息,一般使用線性濾波器... - bcbobo21cn
- 2016年03月12日 20:27
- 18060
kinect 2.0 SDK學習筆記(六)--深度圖的實時平滑之加權移動平均機制
上一節我們介紹了像素濾波器,下面介紹另一個實時平滑深度圖的機制–加權移動平均機制。3.2 加權移動平均機制我們通過觀察可以發現,即使kinect采集的是一個靜止的場景,在得到的深度圖上,同一個像素位置... - jiaojialulu
- 2016年11月17日 22:59
- 1555
人人都能看懂的 AI 入門課
本課程將講述人工智能的現狀、應用場景和入門方法,并通過運用 TensorFlow,使得受眾能清晰了解人工智能的運作方式。 關于kinect v2性能分析的一些論文
PERFORMANCE EVALUATION OF THE 1ST AND 2ND GENERATION KINECT FOR MULTIMEDIA APPLICATIONS首先介紹了兩代kinect... - jiaojialulu
- 2016年10月19日 12:07
- 4122
圖像平均及其在降噪方面的應用
圖像平均及其在降噪方面的應用圖像平均以及圖像平均在應對椒鹽/高斯/相機噪聲方面的對比分析概述:圖像平均操作是減少圖像噪聲的一種簡單方式。我們可以簡單地從圖像列表中計算出一幅平均圖像... - sunmc1204953974
- 2016年02月03日 11:02
- 4297
VS2010配置opencv2.4.10,添加kinect的庫
轉載來自:http://blog.sina.com.cn/s/blog_a3c8055e0102vedf.html因為工作需要,小小的研究一下Opencv的圖像處理,主要目的是對圖像做銳化,高... - songyimin1208
- 2016年01月06日 16:53
- 781
Delphi7高級應用開發隨書源碼
OpenCV學習筆記(20)Kinect + OpenNI + OpenCV + OpenGL 組合體驗
1. 項目源碼詳見:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=13042&extra=(2014-05-21 更新鏈接)2. ... - mengfanteng
- 2014年10月01日 12:19
- 1013
Kinect2.0+OpenCV獲取骨骼圖
在代碼里進行了坐標轉換,把CameraSpace轉到DepthSpace。 然后用和示例代碼(D2D的)里一樣的方式進行繪制,但是由于Opencv里自帶的顯示圖像的窗口默認以BGR3通道顯示圖像,A... - qq_22033759
- 2015-10-05 00:34
- 2598
Kinect 2.0 + OpenCV 顯示深度數據、骨架信息、手勢狀態和人物二值圖
使用Kinect 2.0 + OpenCV 獲取深度信息(Depth Data),骨架信息(Body Data),手勢狀態(Hand State)和人物二值圖(Body Index Data)。 - jiangfan2014
- 2014-11-04 02:07
- 7247
基于深度學習的圖像去噪(論文總結)
2015深度學習、自編碼器、低照度圖像增強Lore, Kin Gwn, Adedotun Akintayo, and Soumik Sarkar. "LLNet: A Deep Autoencod... - geekmanong
- 2016-01-24 00:24
- 6465
OpenCV圖像去噪
OpenCV圖像去噪 - jacke121
- 2017-02-15 19:55
- 995
openCV之中值濾波&均值濾波(及代碼實現)
在開始我們今天的博客之前,我們需要先了解一下什么是濾波:首先我們看一下圖像濾波的概念。圖像濾波,即在盡量保留圖像細節特征的條件下對目標圖像的噪聲進行抑制,是圖像預處理中不可缺少的操作,其處理效果的... - zhb773624502
- 2017-05-24 11:17
- 266
【OpenCV入門教程之八】線性鄰域濾波專場:方框濾波、均值濾波與高斯濾波
本系列文章由@淺墨_毛星云 出品,轉載請注明出處。??文章鏈接:?http://blog.csdn.net/poem_qianmo/article/details/22... - aasd1m
- 2016-12-07 15:58
- 410
2 kinect for windows(k4w) sdk之提取深度圖像并利用opencv顯示
配置好環境后,其中打開傳感器等函數及類都寫在 Kinect.h里面,這個可以在c://program//microsoft sdk//kinect里面找到,接下來我們就可以利用它來編程開發了。 其中... - qq_16949707
- 2017-01-18 14:17
- 632
ubuntu 14.04 +Kinect+ openNI+ openCV+ Sensorkinect 配置 +獲取深度圖像及相關問題
1. 最初參考的是:http://blog.csdn.net/u011700636/article/details/41493645的教程過程,但是其中遇到諸多問題,主要是來自于git包的問題,好像是... - chuckdanglars
- 2016-06-27 11:06
- 2656
kinect2.0+opencv獲取圖像和深度圖像
參考這篇博客的程序,http://blog.csdn.net/yongshengsilingsa/article/details/37935975//師兄寫的獲取深度信息的程序,并且將深度信息存儲為... - lgdnr
- 2015-12-26 17:11
- 2240
KINECT+opencv(1)將骨骼圖像轉化為深度圖像后姿勢識別
KINECT+opencv將骨骼圖像轉化為深度圖像后姿勢識別環境:kinect1.7+opencv2.4+vc2015使用kinect獲取三維空間內的骨骼圖像并轉換為深度圖像坐標繪制對二維的圖像進... - Daky_u
- 2016-05-07 17:15
- 2330
Augusdi
原創
1019 粉絲
6318 喜歡
1 碼云
未開通 他的最新文章
更多文章
- double類型數據在內存中中存儲格式
- C++讀二進制文件 及 C++設置double精度
- lex yacc 學習
在線課程
-
白鷺引擎在WebAssembly中的實踐
講師:
-
Apache Weex:移動研發的進階之路
講師:董巖
熱門文章
- CUDA從入門到精通 117154
- OpenCV 獲取攝像頭并顯示攝像頭視頻 81591
- Eigen: C++開源矩陣計算工具——Eigen的簡單用法 79107
- 用SQL語句向表格中插入數據 71273
- 圖像處理常用邊緣檢測算子總結 64347
總結
以上是生活随笔為你收集整理的OpenCV单kinect多帧静止场景的深度图像去噪的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。