日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ROS kinect:OpenNI读取深度图像与彩色图像

發(fā)布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS kinect:OpenNI读取深度图像与彩色图像 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考:小斤的博客

1.創(chuàng)建你的包

  catkin_create_pkg depth_rgb_image?

2.

  將以下代碼粘貼到src/depth_rgb_image.cpp

  

#include <stdlib.h> #include <iostream> #include <string> //【1】 #include <XnCppWrapper.h> #include "opencv/cv.h" #include "opencv/highgui.h"using namespace std; using namespace cv;void CheckOpenNIError( XnStatus result, string status ) { if( result != XN_STATUS_OK ) cerr << status << " Error: " << xnGetStatusString( result ) << endl; }int main( int argc, char** argv ) {XnStatus result = XN_STATUS_OK; xn::DepthMetaData depthMD;xn::ImageMetaData imageMD;//OpenCVIplImage* imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);IplImage* depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);cvNamedWindow("depth",1);cvNamedWindow("image",1);char key=0;//【2】// context xn::Context context; result = context.Init(); CheckOpenNIError( result, "initialize context" ); // creategenerator xn::DepthGenerator depthGenerator; result = depthGenerator.Create( context ); CheckOpenNIError( result, "Create depth generator" ); xn::ImageGenerator imageGenerator;result = imageGenerator.Create( context ); CheckOpenNIError( result, "Create image generator" );//【3】//map mode XnMapOutputMode mapMode; mapMode.nXRes = 640; mapMode.nYRes = 480; mapMode.nFPS = 30; result = depthGenerator.SetMapOutputMode( mapMode ); result = imageGenerator.SetMapOutputMode( mapMode ); //【4】// correct view port depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); //【5】//read dataresult = context.StartGeneratingAll(); //【6】result = context.WaitNoneUpdateAll(); while( (key!=27) && !(result = context.WaitNoneUpdateAll( )) ) { //get meta data depthGenerator.GetMetaData(depthMD); imageGenerator.GetMetaData(imageMD);//【7】//OpenCV outputmemcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);cvShowImage("depth", depthShow);cvShowImage("image",imageShow);key=cvWaitKey(20);}//destroycvDestroyWindow("depth");cvDestroyWindow("image");cvReleaseImage(&imgDepth16u);cvReleaseImage(&imgRGB8u);cvReleaseImage(&depthShow);cvReleaseImage(&imageShow);context.StopGeneratingAll();context.Shutdown();return 0; }

?

3.代碼解釋

【1】<XnCppWrapper.h>便是OpenNI的文件頭了,使用OpenNI的話,目前只要include這個就行。

【2】DepthGenerator和ImageGenerator,小斤稱之為圖像生成器,前者負(fù)責(zé)深度圖像,后者負(fù)責(zé)彩色圖像。創(chuàng)建一個生成器非常簡單,首先我們要初始化一個Context上下文,然后把Context作為Create函數(shù)的參數(shù),便可以創(chuàng)建生成器了。

【3】XnMapOutputMode是用來設(shè)定生成器的參數(shù)的,這邊小斤設(shè)定了分辨率為640*480(標(biāo)準(zhǔn)),30fps采樣。

【4】depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator)這句話也許會讓大家疑惑,它是用來調(diào)整視角的。為什么要調(diào)整呢?因為Kinect的三只眼長在不同的地方,所以畫幅一致的深度攝像頭和彩色攝像頭,它們看出來的景物是有偏差的,這里OpenNI提供了函數(shù)進(jìn)行對齊。這里,小斤把深度生成器的視角,設(shè)定為彩色生成器的視角。

【5】調(diào)用StartGeneratingAll()后,生成器們便開始上班了,如果要結(jié)束,就StopGeneratingAll()函數(shù)。

【6】盡管生成器們在工作了,但他們一直忙著各讀各的,沒有人協(xié)調(diào),自己不會乖乖把最新的資料給我們。我們調(diào)用getMetaData()方法前,需要使用WaitAnyUpdateAll()、WaitOneUpdateAll()、WaitNoneUpdateAll()和WiatAndUpdateAll()中的一種。功能如其名,這邊小斤使用的是WaitNoneUpdateAll()函數(shù),它比較暴力,不管生成器有沒有讀到新數(shù)據(jù),我這邊先更新了再說。大家可以試試其它三個,看看效果。

【7】這邊使用OpenNI獲得圖像MetaData數(shù)據(jù)后,小斤通過一系列函數(shù),轉(zhuǎn)換為OpenCV的IplImage圖像類型,然后輸出。主要參考了這篇文章。

???????對于深度MetaData,這邊使用cvConvertScale轉(zhuǎn)換尺度,成為灰度值[0,255]的灰度圖。對于彩色MetaData,使用cvCvtColor轉(zhuǎn)換色彩空間即可。

4.打開package.xml,添加

<build_depend>XnCppWrapper</build_depend><run_depend>XnCppWrapper</run_depend><cpp cflags="-I/你的OPENNI路徑"/>

5.打開CMakeLists.txt,添加

find_package( OpenCV REQUIRED ) include_directories(${OpenCV_INCLUDE_DIRS}"/usr/include/ni" ) add_executable(depth_rgb_image src/depth_rgb_image.cpp) target_link_libraries(depth_rgb_image OpenNI ${OpenCV_LIBRARIES} )

6.編譯代碼

cd %TOP_DIR_YOUR_CATKIN_WORKSPACE% catkin_make

7.運行代碼

rosrun depth_rgb_image depth_rgb_image

如果以上代碼不能運行,請新source你的setup.bash

8.退出ctrl+c

9.用rivz顯示

  1)

rosmake rviz

  2)

rosrun depth_rbg_image depth_rbg_image rosrun rviz rviz

  3)修改界面上的部分參數(shù)即可看見圖像

  

轉(zhuǎn)載于:https://www.cnblogs.com/Bubls/p/5278414.html

總結(jié)

以上是生活随笔為你收集整理的ROS kinect:OpenNI读取深度图像与彩色图像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。