当前位置: 代码迷 >> 综合 >> OpenNI+OpenCV对Kinect采集的彩色图和深度图进行滤波
  详细解决方案

OpenNI+OpenCV对Kinect采集的彩色图和深度图进行滤波

热度:19   发布时间:2023-12-12 07:07:50.0

from: OpenNI+OpenCV对Kinect采集的彩色图和深度图进行滤波


平台:Windows 7 x86,OpenCV2.4.9,OpenNI1.5.4.0,VS2010

        采用了4种方式对彩色图和深度图进行滤波,分别为均值滤波、高斯滤波、中值滤波和双边滤波。并且利用滚动条实现4种滤波方式的参数可调。

[cpp] view plain copy
  1. <span style="font-size:14px;">#include <stdlib.h>    
  2. #include <iostream>    
  3. #include <string>    
  4.   
  5. #include <XnCppWrapper.h>    
  6. #include <opencv2/opencv.hpp>    
  7.   
  8. using namespace std;    
  9. using namespace xn;    
  10. using namespace cv;    
  11.   
  12. //---------------------------------【全局变量声明】---------------------------------//  
  13. Mat cvBGRImage,       blur_c_out, GaussianBlur_c_out, MedianBlur_c_out, bilateralFilter_c_out;   
  14. Mat cvDepthImage8UC1, blur_g_out, GaussianBlur_g_out, MedianBlur_g_out, bilateralFilter_g_out;    
  15.   
  16. int g_nMeanBlurValue=10;           //均值滤波内核值  
  17. int g_nGaussianBlurValue=6;    //高斯滤波内核值  
  18. int g_nMedianBlurValue=10;     //中值滤波参数值  
  19. int g_nBilateralFilterValue=10;    //双边滤波参数值  
  20. //---------------------------------------------------------------------------------//  
  21.   
  22. //---------------------------------【全局函数声明】---------------------------------//  
  23. static void on_MeanBlur_c(intvoid *);         //均值滤波器(彩色)  
  24. static void on_GaussianBlur_c(intvoid *);     //高斯滤波器(彩色)  
  25. static void on_MedianBlur_c(intvoid *);       //中值滤波器(彩色)  
  26. static void on_BilateralFilter_c(intvoid *);          //双边滤波器(彩色)  
  27.   
  28. static void on_MeanBlur_g(intvoid *);         //均值滤波器(深度)  
  29. static void on_GaussianBlur_g(intvoid *);     //高斯滤波器(深度)  
  30. static void on_MedianBlur_g(intvoid *);       //中值滤波器(深度)  
  31. static void on_BilateralFilter_g(intvoid *);          //双边滤波器(深度)  
  32. void ShowHelpText();  
  33. //---------------------------------------------------------------------------------//  
  34.   
  35. void CheckOpenNIError(XnStatus eResult,string sStatus)  //检测错误并返回错误的函数    
  36. {    
  37.     if(eResult != XN_STATUS_OK)    
  38.         cout << sStatus << "Error: " << xnGetStatusString(eResult) << endl;  
  39. }    
  40.   
  41. int main()    
  42. {    
  43.     //system("color 4F");   //cmd窗口颜色    
  44.   
  45.     ShowHelpText();   
  46.   
  47.     XnStatus eResult = XN_STATUS_OK;    
  48.     ImageMetaData imageMD;    
  49.     DepthMetaData depthMD;    
  50.   
  51.     Context mContext;   //初始化上下文对象    
  52.     eResult = mContext.Init();    
  53.     CheckOpenNIError(eResult, "Initialize context");    
  54.   
  55.     ImageGenerator mImageGenerator;     //创建彩色图像生产节点    
  56.     eResult = mImageGenerator.Create(mContext);    
  57.     CheckOpenNIError(eResult, "Create image generator");    
  58.   
  59.     DepthGenerator mDepthGenerator;     //创建深度图像生产节点    
  60.     eResult = mDepthGenerator.Create(mContext);    
  61.     CheckOpenNIError(eResult, "Create depth generator");    
  62.   
  63.     XnMapOutputMode mapMode;    //设置图像分辨率    
  64.     mapMode.nXRes = 640;    
  65.     mapMode.nYRes = 480;   
  66.     mapMode.nFPS  = 30;    
  67.     eResult = mImageGenerator.SetMapOutputMode(mapMode);    
  68.     eResult = mDepthGenerator.SetMapOutputMode(mapMode);    
  69.   
  70.     mDepthGenerator.GetAlternativeViewPointCap().SetViewPoint(mImageGenerator);//深度图像视角转换成彩色图象视角    
  71.   
  72.     eResult = mContext.StartGeneratingAll();    //开始产生数据    
  73.   
  74.     char key;  
  75.     while((key != 27) && !(eResult = mContext.WaitNoneUpdateAll()))    
  76.     {    
  77.         //-------------------------------------------【【【彩色图像处理部分】】】--------------------------------------------//  
  78.         //====================【<0>原图-彩色】====================//  
  79.         mImageGenerator.GetMetaData(imageMD);    
  80.         Mat cvRGBImage(imageMD.FullYRes(), imageMD.FullXRes(), CV_8UC3, (XnUInt8*) imageMD.Data());  
  81.         cvtColor(cvRGBImage, cvBGRImage, CV_RGB2BGR);//整幅图像颜色转换,因为opencv中采用BGR方式排列    
  82.         namedWindow("<0>【原图-彩色】");    
  83.         imshow("<0>【原图-彩色】", cvBGRImage);    
  84.         //=======================================================//  
  85.   
  86.         //====================【<1>均值滤波】====================//  
  87.         blur_c_out = cvBGRImage.clone();  
  88.         namedWindow("<1>均值滤波【效果图-彩色】");   
  89.         createTrackbar("内核值:""<1>均值滤波【效果图-彩色】",&g_nMeanBlurValue, 50,on_MeanBlur_c );  
  90.         on_MeanBlur_c(g_nMeanBlurValue,0);  
  91.         //======================================================//  
  92.   
  93.         //====================【<2>高斯滤波】====================//  
  94.         GaussianBlur_c_out = cvBGRImage.clone();  
  95.         namedWindow("<2>高斯滤波【效果图-彩色】");    
  96.         createTrackbar("内核值:""<2>高斯滤波【效果图-彩色】",&g_nGaussianBlurValue, 50,on_GaussianBlur_c );  
  97.         on_GaussianBlur_c(g_nGaussianBlurValue,0);  
  98.         //======================================================//  
  99.   
  100.         //====================【<3>中值滤波】====================//  
  101.         MedianBlur_c_out = cvBGRImage.clone();  
  102.         namedWindow("<3>中值滤波【效果图-彩色】");    
  103.         createTrackbar("参数值:""<3>中值滤波【效果图-彩色】",&g_nMedianBlurValue, 50,on_MedianBlur_c );  
  104.         on_MedianBlur_c(g_nMedianBlurValue,0);  
  105.         //======================================================//  
  106.   
  107.         //====================【<4>双边滤波】====================//  
  108.         bilateralFilter_c_out = cvBGRImage.clone();  
  109.         namedWindow("<4>双边滤波【效果图-彩色】");   
  110.         createTrackbar("参数值:""<4>双边滤波【效果图-彩色】",&g_nBilateralFilterValue, 50,on_BilateralFilter_c);  
  111.         on_BilateralFilter_c(g_nBilateralFilterValue,0);  
  112.         //======================================================//  
  113.         //---------------------------------------------------------------------------------------------------------//  
  114.   
  115.   
  116.         //-------------------------------------------【【【深度图像处理部分】】】--------------------------------------------//  
  117.         //====================【<0>原图-深度】====================//  
  118.         mDepthGenerator.GetMetaData(depthMD);    
  119.         Mat cvDepthImage16UC1(depthMD.FullYRes(), depthMD.FullXRes(), CV_16UC1, (XnUInt16*) depthMD.Data());      
  120.         cvDepthImage16UC1.convertTo(cvDepthImage8UC1, CV_8UC1, 255.0/(depthMD.ZRes())); //格式转换    
  121.         namedWindow("<0>【原图-深度】");    
  122.         imshow("<0>【原图-深度】", cvDepthImage8UC1);  
  123.         //======================================================//  
  124.   
  125.         //====================【<1>均值滤波】====================//  
  126.         blur_g_out = cvDepthImage8UC1.clone();  
  127.         namedWindow("<1>均值滤波【效果图-深度】");   
  128.         createTrackbar("内核值:""<1>均值滤波【效果图-深度】",&g_nMeanBlurValue, 50,on_MeanBlur_g );  
  129.         on_MeanBlur_g(g_nMeanBlurValue,0);  
  130.         //======================================================//  
  131.           
  132.         //====================【<2>高斯滤波】====================//  
  133.         GaussianBlur_g_out = cvDepthImage8UC1.clone();  
  134.         namedWindow("<2>高斯滤波【效果图-深度】");    
  135.         createTrackbar("内核值:""<2>高斯滤波【效果图-深度】",&g_nGaussianBlurValue, 50,on_GaussianBlur_g );  
  136.         on_GaussianBlur_g(g_nGaussianBlurValue,0);  
  137.         //======================================================//  
  138.   
  139.         //====================【<3>中值滤波】====================//  
  140.         MedianBlur_g_out = cvDepthImage8UC1.clone();  
  141.         namedWindow("<3>中值滤波【效果图-深度】");   
  142.         createTrackbar("参数值:""<3>中值滤波【效果图-深度】",&g_nMedianBlurValue, 50,on_MedianBlur_g );  
  143.         on_MedianBlur_g(g_nMedianBlurValue,0);  
  144.         //======================================================//  
  145.   
  146.         //====================【<4>双边滤波】====================//  
  147.         bilateralFilter_g_out = cvDepthImage8UC1.clone();  
  148.         namedWindow("<4>双边滤波【效果图-深度】");    
  149.         createTrackbar("参数值:""<4>双边滤波【效果图-深度】",&g_nBilateralFilterValue, 50,on_BilateralFilter_g);  
  150.         on_BilateralFilter_g(g_nBilateralFilterValue,0);  
  151.         //======================================================//  
  152.         //----------------------------------------------------------------------------------------------------------//  
  153.   
  154.         key = waitKey(20);    
  155.     }    
  156.   
  157.     mContext.StopGeneratingAll();   //停止产生数据    
  158.     mContext.Shutdown();    
  159.     return 0;    
  160. }   
  161.   
  162. //-----------------------------【on_MeanBlur( )函数】------------------------------------  
  163. //      均值滤波操作的回调函数  
  164. //----------------------------------------------------------------------------------------------  
  165. static void on_MeanBlur_c(intvoid *)  
  166. {  
  167.     blur( cvBGRImage, blur_c_out, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1), Point(-1,-1));  
  168.     imshow("<1>均值滤波【效果图-彩色】", blur_c_out);  
  169. }  
  170. static void on_MeanBlur_g(intvoid *)  
  171. {  
  172.     blur( cvDepthImage8UC1, blur_g_out, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1), Point(-1,-1));  
  173.     imshow("<1>均值滤波【效果图-深度】", blur_g_out);  
  174. }  
  175.   
  176. //-----------------------------【on_GaussianBlur( )函数】------------------------------------  
  177. //      高斯滤波操作的回调函数  
  178. //-----------------------------------------------------------------------------------------------  
  179. static void on_GaussianBlur_c(intvoid *)  
  180. {  
  181.     GaussianBlur( cvBGRImage, GaussianBlur_c_out, Size( g_nGaussianBlurValue*2+1, g_nGaussianBlurValue*2+1 ), 0, 0);  
  182.     imshow("<2>高斯滤波【效果图-彩色】", GaussianBlur_c_out);  
  183. }  
  184. static void on_GaussianBlur_g(intvoid *)  
  185. {  
  186.     GaussianBlur( cvDepthImage8UC1, GaussianBlur_g_out, Size( g_nGaussianBlurValue*2+1, g_nGaussianBlurValue*2+1 ), 0, 0);  
  187.     imshow("<2>高斯滤波【效果图-深度】", GaussianBlur_g_out);  
  188. }  
  189.   
  190.   
  191. //-----------------------------【on_MedianBlur( )函数】------------------------------------  
  192. //      中值滤波操作的回调函数  
  193. //-----------------------------------------------------------------------------------------------  
  194. static void on_MedianBlur_c(intvoid *)  
  195. {  
  196.     medianBlur ( cvBGRImage, MedianBlur_c_out, g_nMedianBlurValue*2+1 );  
  197.     imshow("<3>中值滤波【效果图-彩色】", MedianBlur_c_out);  
  198. }  
  199. static void on_MedianBlur_g(intvoid *)  
  200. {  
  201.     medianBlur ( cvDepthImage8UC1, MedianBlur_g_out, g_nMedianBlurValue*2+1 );  
  202.     imshow("<3>中值滤波【效果图-深度】", MedianBlur_g_out);  
  203. }  
  204.   
  205.   
  206. //-----------------------------【on_BilateralFilter( )函数】------------------------------------  
  207. //      双边滤波操作的回调函数  
  208. //-----------------------------------------------------------------------------------------------  
  209. static void on_BilateralFilter_c(intvoid *)  
  210. {  
  211.     bilateralFilter ( cvBGRImage, bilateralFilter_c_out, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2 );  
  212.     imshow("<4>双边滤波【效果图-彩色】", bilateralFilter_c_out);  
  213. }  
  214. static void on_BilateralFilter_g(intvoid *)  
  215. {  
  216.     bilateralFilter ( cvDepthImage8UC1, bilateralFilter_g_out, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2 );  
  217.     imshow("<4>双边滤波【效果图-深度】", bilateralFilter_g_out);  
  218. }  
  219.   
  220. //-----------------------------------【ShowHelpText( )函数】-----------------------------  
  221. //      输出一些帮助信息  
  222. //----------------------------------------------------------------------------------------------  
  223. void ShowHelpText()  
  224. {  
  225.     //输出各滤波器的初始内核值  
  226.     printf("\n\n\t\t\t均值滤波器的初始内核值:10\n");  
  227.     printf("\n\n\t\t\t高斯滤波器的初始内核值:6\n");  
  228.     printf("\n\n\t\t\t中值滤波器的初始参数值:10\n");  
  229.     printf("\n\n\t\t\t双边滤波器的初始参数值:10\n");  
  230.     printf("\n\n  ----------------------------------------------------------------------------\n");  
  231. }