平台:Windows 7 x86,OpenCV2.4.9,OpenNI1.5.4.0,VS2010
首先采用了双边滤波对或得的彩色图像进行滤波,然后保存滤波后的图像。
#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, BilateralFilter_c_out; int g_nBilateralFilterValue=10; //双边滤波参数值 int imageNumber = 0; //记录保存的图像的个数 //---------------------------------【全局函数声明】---------------------------------// static void on_BilateralFilter_c(int, void *); //双边滤波器(彩色) void CheckOpenNIError(XnStatus eResult,string sStatus); //------------------------------------【主函数】------------------------------------// int main() { ImageMetaData imageMD; DepthMetaData depthMD; XnStatus eResult = XN_STATUS_OK; Context mContext; //初始化上下文对象 eResult = mContext.Init(); CheckOpenNIError(eResult, "Initialize context"); ImageGenerator mImageGenerator; //创建彩色图像生产节点 eResult = mImageGenerator.Create(mContext); CheckOpenNIError(eResult, "Create image generator"); XnMapOutputMode mapMode; //设置图像分辨率 mapMode.nXRes = 640; mapMode.nYRes = 480; mapMode.nFPS = 30; eResult = mImageGenerator.SetMapOutputMode(mapMode); eResult = mContext.StartGeneratingAll(); //开始产生数据 char key; while(!(eResult = mContext.WaitNoneUpdateAll())) { mImageGenerator.GetMetaData(imageMD); Mat cvRGBImage(imageMD.FullYRes(), imageMD.FullXRes(), CV_8UC3, (char*) imageMD.Data()); cvtColor(cvRGBImage, cvBGRImage, CV_RGB2BGR); //======================【<0>双边滤波】====================// BilateralFilter_c_out = cvBGRImage.clone(); bilateralFilter ( cvBGRImage, BilateralFilter_c_out, 10, 20, 5 ); namedWindow("<0>双边滤波【效果图-彩色】"); imshow("<0>双边滤波【效果图-彩色】", BilateralFilter_c_out); key = waitKey(5); if(key == 27) //按下Esc键保存图像 { ++imageNumber; std::stringstream ss; ss << "D:/Pictures/" << "Image" << imageNumber << ".jpg"; imwrite(ss.str(), BilateralFilter_c_out); } } mContext.StopGeneratingAll(); //停止产生数据 mContext.Shutdown(); return 0; } //-------------------------------【CheckOpenNIError( )函数】-------------------------------- // 检测错误并返回错误 //---------------------------------------------------------------------------------------------- void CheckOpenNIError(XnStatus eResult,string sStatus) { if(eResult != XN_STATUS_OK) cout << sStatus << "Error: " << xnGetStatusString(eResult) << endl; }