1. 程式人生 > >OpenNI+OpenCV對Kinect採集的彩色圖和深度圖進行濾波

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>


相關推薦

OpenNI+OpenCVKinect採集彩色深度進行濾波

平臺:Windows 7 x86,OpenCV2.4.9,OpenNI1.5.4.0,VS2010         採用了4種方式對彩色圖和深度圖進行濾波,分別為均值濾波、高斯濾波、中值濾波和雙邊濾波。並且利用滾動條實現4種濾波方式的引數可調。 <span styl

結合彩色深度建立點雲(OpenCV+OpenNI+PCL)

試驗了好久了,終於成功了!用OpenNI獲取彩色和深度資料流,轉化成OpenCV的Mat影象格式。 對相機進行標定,獲取相機的內部引數: Calibration results after optimization (with uncertainties):   //優化後

在ROS下,攝像頭kinect V1的RGB深度的獲取

    驅動安裝好後,首先在終端輸入“roscore”,啟動節點,然後在新的終端輸入“roslaunch freenect_launch freenect-registered-xyzrgb.launch”或者“roslaunch freenect_launch freenect

彩色深度轉點雲

環境:windows10、VS2013、opencv 2.49、openNi、PCL1.8opencv 環境搭建參考PCL1.8+openNi搭建參考將上面的opencv和pcl的配置儲存到屬性表中,以便下一次快速引用。新建專案,選擇解決方案配置選擇Debug x64,屬性管

ROS使用openni獲取Kinect彩色影象深度影象

本實驗使用Ubuntu14.04的64bit版本,ROS使用Indigo版本,影象獲取使用OpenNI1(因為OpenNI2中未找到彩色影象和深度影象對齊功能,臺灣的一代大神Heresy已經實現這一功能,但是我更喜歡OpenNI1官方對齊方法),影象處理使用OpenCV2

Kinect骨骼資料與彩色影像深度影像的

 很多同學留言問怎麼講兩種影像資料顯示在同一張螢幕上,也就是說怎麼將骨骼資料疊加到彩色影像或者深度影像上,將彩色影像疊加到深度影像就不討論了,因為沒啥意義。     這個問題其實很簡單,因為在Kinect Developer Toolkit中很多例子中又可以看到這兩種型

PostgreSQL現有,新建的表授權給用戶

PostgreSQL對現有新建的表和視由於開發提出需求:(1)在多個PostgreSQL的instacne上面創建一個readonly用戶,僅對數據庫裏面的表或者視圖(包括物化視圖)有僅有select權限,並且對以後新建的表和視圖也要有select權限,我們知道PostgreSQL 在schema下新建

realsense彩色影象深度影象

首先宣告realsense通道,封裝實際裝置和感測器 //初始化 pipeline pipe; pipeline_profile profile = pipe.start(); rs2_stream align_to = find_stream_to_align(p

OpenCV的Delaunay三角剖分Voronoi的實現

給定平面中的一組點,三角測量指的是將平面細分為三角形,將點作為頂點。在圖1中,我們在左影象上看到一組界標,以及在中間影象中的三角測量。一組點可以有許多可能的三角剖分,但Delaunay三角剖分出眾,因為它有一些不錯的屬性。在Delaunay三角剖分中,選擇三角形使得沒有點在任何三角形的外接圓內。圖2示出了4點

matlab 彩色熱力疊加顯示

im = imread('color.jpg'); %彩色圖 im = double(im); gray = imread('gray.jpg'); % 熱力圖 gray = double(gray); cmap = colormap(jet(256)); rgb =

uml類er中主外鍵的表示區別

合同 數據 引用 cnblogs nbsp 單獨 .cn .com 圖表 在er圖也就是數據庫中,無論是mysql/oracle都是從表引用主表的pk作為外鍵。 而在uml類圖表示法中,他們的順序則剛好相反,從主對象導向到子對象,如下: 主體是資金借款方,征信信息和資金借

ECHARTS柱形數值顯示

echartsECHARTS柱形圖和餅圖數值顯示,官方文檔寫的很不錯,這裏自己單獨梳理一下,以後可能會用的到。1、柱形圖數值顯示 在option添加: label:{ normal:{ show: true, position: ‘to

UML--行為(活動狀態

uml 活動圖 狀態圖 行為圖 活動圖簡介簡單介紹為了完成某個目標需要做的活動以及這些活動的執行順序,著重表現的是系統的行為,而非系統的處理過程組成元素起始點、活動、判斷、同步、結束點、基本流、支流、異常流、組合活動、泳道分類用例活動圖:描述了如何來達到這個目標,業務流程一般包括一個基本業務流

需求分析用例活動

pos com post OS 分享 http 需求 分析 活動 需求分析用例圖和活動圖

Android之通過ContentResolver獲取手機圖片視訊的路徑生成縮路徑

1 問題 獲取手機所有圖片和視訊的路徑和生成圖片和視訊的縮圖和縮圖路徑 生成縮圖我們用的系統函式 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Opti

Cytoscape製作帶barpie節點的網路

採用cytoscape製作帶bar圖和pie圖節點的網路圖 作者:中科院微生物所 陳亮博士 本教程旨在告訴大家如何使用cytoscape根據Node資訊表格製作帶有barplot資訊節點的網路圖。以安裝資料夾下的樣例資料為例。 軟體安裝(裝過請跳過) Java安裝 C

iOS 使用AFN 進行上傳

圖片上傳時必要將圖片進行壓縮,不然會上傳失敗 1.單張圖上傳 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];    [manager POST:urlStr

Picsew | 推薦一款長截拼接工具

推薦一款長截圖工具,Picsew,擁有三項基本功能:長截圖、豎向拼接和橫向拼接。 用法簡單,只看效果,不作介紹。 好像只能 iPhone 用,由於太久不用 Android,安卓的話,其他小夥伴有沒有推薦的,可以留言分享一下。 下面來看看以買書為樂的嚴 CEO 聊天截圖拼接。

python 使用 matplotlib.pyplot來畫柱狀

匯入包 import matplotlib.pyplot as plt 柱狀圖 最簡柱狀圖 # 顯示高度 def autolabel(rects): for rect in rects: height = rect.get_height() plt.text(r

html 影象處理 灰度浮雕類PS

    html5 的canvas還有一些很酷炫的效果,接下來講的是canvas對畫素的處理,雖然略有些複雜,但實現出的效果,還是很讚的~~。    為了不讓大家失望,先強調一句:下列效果需呼叫getImageData(),而這個方法會被某些瀏覽器阻止,如