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

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

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

<span style="font-size:14px;">#include <stdlib.h>  
#include <iostream>  
#include <string>  

#include <XnCppWrapper.h>  
#include <opencv2/opencv.hpp>  

using namespace std;  
using namespace xn;  
using namespace cv;  

//---------------------------------【全局变量声明】---------------------------------//
Mat cvBGRImage,       blur_c_out, GaussianBlur_c_out, MedianBlur_c_out, bilateralFilter_c_out; 
Mat cvDepthImage8UC1, blur_g_out, GaussianBlur_g_out, MedianBlur_g_out, bilateralFilter_g_out;  

int g_nMeanBlurValue=10;           //均值滤波内核值
int g_nGaussianBlurValue=6;	   //高斯滤波内核值
int g_nMedianBlurValue=10;	   //中值滤波参数值
int g_nBilateralFilterValue=10;	   //双边滤波参数值
//---------------------------------------------------------------------------------//

//---------------------------------【全局函数声明】---------------------------------//
static void on_MeanBlur_c(int, void *);			//均值滤波器(彩色)
static void on_GaussianBlur_c(int, void *);		//高斯滤波器(彩色)
static void on_MedianBlur_c(int, void *);		//中值滤波器(彩色)
static void on_BilateralFilter_c(int, void *);	        //双边滤波器(彩色)

static void on_MeanBlur_g(int, void *);			//均值滤波器(深度)
static void on_GaussianBlur_g(int, void *);		//高斯滤波器(深度)
static void on_MedianBlur_g(int, void *);		//中值滤波器(深度)
static void on_BilateralFilter_g(int, void *);	        //双边滤波器(深度)
void ShowHelpText();
//---------------------------------------------------------------------------------//

void CheckOpenNIError(XnStatus eResult,string sStatus)	//检测错误并返回错误的函数  
{  
	if(eResult != XN_STATUS_OK)  
		cout << sStatus << "Error: " << xnGetStatusString(eResult) << endl;
}  

int main()  
{  
	//system("color 4F");	//cmd窗口颜色  

	ShowHelpText();	

	XnStatus eResult = XN_STATUS_OK;  
	ImageMetaData imageMD;  
	DepthMetaData depthMD;  

	Context mContext;	//初始化上下文对象  
	eResult = mContext.Init();  
	CheckOpenNIError(eResult, "Initialize context");  

	ImageGenerator mImageGenerator;		//创建彩色图像生产节点  
	eResult = mImageGenerator.Create(mContext);  
	CheckOpenNIError(eResult, "Create image generator");  

	DepthGenerator mDepthGenerator;		//创建深度图像生产节点  
	eResult = mDepthGenerator.Create(mContext);  
	CheckOpenNIError(eResult, "Create depth generator");  

	XnMapOutputMode mapMode;	//设置图像分辨率  
 	mapMode.nXRes = 640;  
 	mapMode.nYRes = 480; 
	mapMode.nFPS  = 30;  
	eResult = mImageGenerator.SetMapOutputMode(mapMode);  
	eResult = mDepthGenerator.SetMapOutputMode(mapMode);  

	mDepthGenerator.GetAlternativeViewPointCap().SetViewPoint(mImageGenerator);//深度图像视角转换成彩色图象视角  

	eResult = mContext.StartGeneratingAll();	//开始产生数据  

	char key;
	while((key != 27) && !(eResult = mContext.WaitNoneUpdateAll()))  
	{  
		//-------------------------------------------【【【彩色图像处理部分】】】--------------------------------------------//
		//====================【<0>原图-彩色】====================//
		mImageGenerator.GetMetaData(imageMD);  
		Mat cvRGBImage(imageMD.FullYRes(), imageMD.FullXRes(), CV_8UC3, (XnUInt8*) imageMD.Data());
		cvtColor(cvRGBImage, cvBGRImage, CV_RGB2BGR);//整幅图像颜色转换,因为opencv中采用BGR方式排列  
		namedWindow("<0>【原图-彩色】");  
		imshow("<0>【原图-彩色】", cvBGRImage);  
		//=======================================================//

		//====================【<1>均值滤波】====================//
		blur_c_out = cvBGRImage.clone();
		namedWindow("<1>均值滤波【效果图-彩色】"); 
		createTrackbar("内核值:", "<1>均值滤波【效果图-彩色】",&g_nMeanBlurValue, 50,on_MeanBlur_c );
		on_MeanBlur_c(g_nMeanBlurValue,0);
		//======================================================//

		//====================【<2>高斯滤波】====================//
		GaussianBlur_c_out = cvBGRImage.clone();
		namedWindow("<2>高斯滤波【效果图-彩色】");  
		createTrackbar("内核值:", "<2>高斯滤波【效果图-彩色】",&g_nGaussianBlurValue, 50,on_GaussianBlur_c );
		on_GaussianBlur_c(g_nGaussianBlurValue,0);
		//======================================================//

		//====================【<3>中值滤波】====================//
		MedianBlur_c_out = cvBGRImage.clone();
		namedWindow("<3>中值滤波【效果图-彩色】");  
		createTrackbar("参数值:", "<3>中值滤波【效果图-彩色】",&g_nMedianBlurValue, 50,on_MedianBlur_c );
		on_MedianBlur_c(g_nMedianBlurValue,0);
		//======================================================//

		//====================【<4>双边滤波】====================//
		bilateralFilter_c_out = cvBGRImage.clone();
		namedWindow("<4>双边滤波【效果图-彩色】"); 
		createTrackbar("参数值:", "<4>双边滤波【效果图-彩色】",&g_nBilateralFilterValue, 50,on_BilateralFilter_c);
		on_BilateralFilter_c(g_nBilateralFilterValue,0);
		//======================================================//
		//---------------------------------------------------------------------------------------------------------//


		//-------------------------------------------【【【深度图像处理部分】】】--------------------------------------------//
		//====================【<0>原图-深度】====================//
		mDepthGenerator.GetMetaData(depthMD);  
		Mat cvDepthImage16UC1(depthMD.FullYRes(), depthMD.FullXRes(), CV_16UC1, (XnUInt16*) depthMD.Data());    
		cvDepthImage16UC1.convertTo(cvDepthImage8UC1, CV_8UC1, 255.0/(depthMD.ZRes()));	//格式转换  
		namedWindow("<0>【原图-深度】");  
		imshow("<0>【原图-深度】", cvDepthImage8UC1);
		//======================================================//

		//====================【<1>均值滤波】====================//
		blur_g_out = cvDepthImage8UC1.clone();
		namedWindow("<1>均值滤波【效果图-深度】"); 
		createTrackbar("内核值:", "<1>均值滤波【效果图-深度】",&g_nMeanBlurValue, 50,on_MeanBlur_g );
		on_MeanBlur_g(g_nMeanBlurValue,0);
		//======================================================//
		
		//====================【<2>高斯滤波】====================//
		GaussianBlur_g_out = cvDepthImage8UC1.clone();
		namedWindow("<2>高斯滤波【效果图-深度】");  
		createTrackbar("内核值:", "<2>高斯滤波【效果图-深度】",&g_nGaussianBlurValue, 50,on_GaussianBlur_g );
		on_GaussianBlur_g(g_nGaussianBlurValue,0);
		//======================================================//

		//====================【<3>中值滤波】====================//
		MedianBlur_g_out = cvDepthImage8UC1.clone();
		namedWindow("<3>中值滤波【效果图-深度】"); 
		createTrackbar("参数值:", "<3>中值滤波【效果图-深度】",&g_nMedianBlurValue, 50,on_MedianBlur_g );
		on_MedianBlur_g(g_nMedianBlurValue,0);
		//======================================================//

		//====================【<4>双边滤波】====================//
		bilateralFilter_g_out = cvDepthImage8UC1.clone();
		namedWindow("<4>双边滤波【效果图-深度】");  
		createTrackbar("参数值:", "<4>双边滤波【效果图-深度】",&g_nBilateralFilterValue, 50,on_BilateralFilter_g);
		on_BilateralFilter_g(g_nBilateralFilterValue,0);
		//======================================================//
		//----------------------------------------------------------------------------------------------------------//

		key = waitKey(20);  
	}  

	mContext.StopGeneratingAll();	//停止产生数据  
	mContext.Shutdown();  
	return 0;  
} 

//-----------------------------【on_MeanBlur( )函数】------------------------------------
//		均值滤波操作的回调函数
//----------------------------------------------------------------------------------------------
static void on_MeanBlur_c(int, void *)
{
	blur( cvBGRImage, blur_c_out, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1), Point(-1,-1));
	imshow("<1>均值滤波【效果图-彩色】", blur_c_out);
}
static void on_MeanBlur_g(int, void *)
{
	blur( cvDepthImage8UC1, blur_g_out, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1), Point(-1,-1));
	imshow("<1>均值滤波【效果图-深度】", blur_g_out);
}

//-----------------------------【on_GaussianBlur( )函数】------------------------------------
//		高斯滤波操作的回调函数
//-----------------------------------------------------------------------------------------------
static void on_GaussianBlur_c(int, void *)
{
	GaussianBlur( cvBGRImage, GaussianBlur_c_out, Size( g_nGaussianBlurValue*2+1, g_nGaussianBlurValue*2+1 ), 0, 0);
	imshow("<2>高斯滤波【效果图-彩色】", GaussianBlur_c_out);
}
static void on_GaussianBlur_g(int, void *)
{
	GaussianBlur( cvDepthImage8UC1, GaussianBlur_g_out, Size( g_nGaussianBlurValue*2+1, g_nGaussianBlurValue*2+1 ), 0, 0);
	imshow("<2>高斯滤波【效果图-深度】", GaussianBlur_g_out);
}


//-----------------------------【on_MedianBlur( )函数】------------------------------------
//		中值滤波操作的回调函数
//-----------------------------------------------------------------------------------------------
static void on_MedianBlur_c(int, void *)
{
	medianBlur ( cvBGRImage, MedianBlur_c_out, g_nMedianBlurValue*2+1 );
	imshow("<3>中值滤波【效果图-彩色】", MedianBlur_c_out);
}
static void on_MedianBlur_g(int, void *)
{
	medianBlur ( cvDepthImage8UC1, MedianBlur_g_out, g_nMedianBlurValue*2+1 );
	imshow("<3>中值滤波【效果图-深度】", MedianBlur_g_out);
}


//-----------------------------【on_BilateralFilter( )函数】------------------------------------
//		双边滤波操作的回调函数
//-----------------------------------------------------------------------------------------------
static void on_BilateralFilter_c(int, void *)
{
	bilateralFilter ( cvBGRImage, bilateralFilter_c_out, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2 );
	imshow("<4>双边滤波【效果图-彩色】", bilateralFilter_c_out);
}
static void on_BilateralFilter_g(int, void *)
{
	bilateralFilter ( cvDepthImage8UC1, bilateralFilter_g_out, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2 );
	imshow("<4>双边滤波【效果图-深度】", bilateralFilter_g_out);
}

//-----------------------------------【ShowHelpText( )函数】-----------------------------
//		输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
	//输出各滤波器的初始内核值
	printf("\n\n\t\t\t均值滤波器的初始内核值:10\n");
	printf("\n\n\t\t\t高斯滤波器的初始内核值:6\n");
	printf("\n\n\t\t\t中值滤波器的初始参数值:10\n");
	printf("\n\n\t\t\t双边滤波器的初始参数值:10\n");
	printf("\n\n  ----------------------------------------------------------------------------\n");
}</span>



你可能感兴趣的:(opencv,kinect,图像处理,openni,Vision,Computer)