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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在《Kinect開發教程二:OpenNI讀取深度圖像與彩色圖像并顯示》中,小斤介紹了OpenNI讀取深度與彩色圖像數據的方法,并且借助OpenCV進行顯示。

OpenNI2在接口上與OpenNI有了較大變化,具體更新可以查看《OpenNI Migration Guide》。從獲取深度,彩色傳感器的數據而言,小斤覺得調用更為直觀,但對于Kinect,一大缺憾是不支持OpenNI2提供的深度與彩色圖像配準的方法(體現在下文中的device.isImageRegistrationModeSupported()方法)。

但使用Kinect的童鞋也不必沮喪,在OpenNI2.1 beta中,小斤看到了新增的convertDepthToColorCoordinates()方法可以做一些深度與彩色坐標數據的轉化,它的效果應該 是與device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR )類似的,有興趣的童鞋可以嘗試一下。

在顯示方面,小斤還是使用OpenCV,這次是使用OpenCV的C++接口進行操作。

/*************************

OpenNI2 Deep, Color and Fusion Image

Author: Xin Chen, 2013.2

Blog: http://blog.csdn.net/chenxin_130

*************************/

#include

#include

#include

#include "OpenNI.h"

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

using namespace std;

using namespace cv;

using namespace openni;

void CheckOpenNIError( Status result, string status )

{

if( result != STATUS_OK )

cerr << status << " Error: " << OpenNI::getExtendedError() << endl;

}

int main( int argc, char** argv )

{

Status result = STATUS_OK;

//OpenNI2 image

VideoFrameRef oniDepthImg;

VideoFrameRef oniColorImg;

//OpenCV image

cv::Mat cvDepthImg;

cv::Mat cvBGRImg;

cv::Mat cvFusionImg;

cv::namedWindow("depth");

cv::namedWindow("image");

cv::namedWindow("fusion");

char key=0;

//【1】

// initialize OpenNI2

result = OpenNI::initialize();

CheckOpenNIError( result, "initialize context" );

// open device

Device device;

result = device.open( openni::ANY_DEVICE );

//【2】

// create depth stream

VideoStream oniDepthStream;

result = oniDepthStream.create( device, openni::SENSOR_DEPTH );

//【3】

// set depth video mode

VideoMode modeDepth;

modeDepth.setResolution( 640, 480 );

modeDepth.setFps( 30 );

modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );

oniDepthStream.setVideoMode(modeDepth);

// start depth stream

result = oniDepthStream.start();

// create color stream

VideoStream oniColorStream;

result = oniColorStream.create( device, openni::SENSOR_COLOR );

// set color video mode

VideoMode modeColor;

modeColor.setResolution( 640, 480 );

modeColor.setFps( 30 );

modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 );

oniColorStream.setVideoMode( modeColor);

//【4】

// set depth and color imge registration mode

if( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )

{

device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );

}

// start color stream

result = oniColorStream.start();

while( key!=27 )

{

// read frame

if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK )

{

// convert data into OpenCV type

cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() );

cv::cvtColor( cvRGBImg, cvBGRImg, CV_RGB2BGR );

cv::imshow( "image", cvBGRImg );

}

if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK )

{

cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );

cvRawImg16U.convertTo( cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));

//【5】

// convert depth image GRAY to BGR

cv::cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);

cv::imshow( "depth", cvDepthImg );

}

//【6】

cv::addWeighted(cvBGRImg,0.5,cvFusionImg,0.5,0,cvFusionImg);

cv::imshow( "fusion", cvFusionImg );

key = cv::waitKey(20);

}

//cv destroy

cv::destroyWindow("depth");

cv::destroyWindow("image");

cv::destroyWindow("fusion");

//OpenNI2 destroy

oniDepthStream.destroy();

oniColorStream.destroy();

device.close();

OpenNI::shutdown();

return 0;

}

小斤由上到下解釋一把:

【1】使用OpenNI::initialize()方法進行初始化,對于錯誤處理,可以使用OpenNI::getExtendedError()方法。在這里,Device對象打開任意一個可用設備。

【2】在OpenNI2中,可以通過創建VideoStream視頻流對象來讀取設備的深度圖像和色彩圖像數據。

【3】對于VideoStream視頻流對象,我們可以設備它的Mode,包括分辨率,FPS,像素格式等等。對于像素格式的類型,可以使用 VideoStream的getSensorInfo()方法獲得,目前Kinect只有PIXEL_FORMAT_DEPTH_1_MM可供選擇。

【4】如果設備支持深度與彩色圖像配準的話,小斤在這里使用OpenNI2自帶的接口進行配準。在while循環中,各個VideoStream對象通過readFrame()來讀取對應的圖像數據。

【5】將OpenNI的圖像數據轉換為OpenCV可顯示的圖像格式。對于彩色圖像,可以先將數據塞入OpenCV三通道(8位)RGB對象,再轉換到 BGR來顯示。對于深度圖像,先放入單通道(16位)對象(這是因為深度數據的值域較大),最近將深度值等比例縮小到[0,255]的值域中,作為灰度圖 顯示。

【6】最后的圖像融合,由于addWeighted()方法需要兩個輸入圖像是同一類型,所以小斤首先將深度灰度圖(單通道),轉化為BGR圖像,這樣就 與彩色圖像一致了。再通過該方法進行融合,小斤使用的比例是0.5,0.5,也就是融合圖像的每個像素點的值,都是(深度圖像該點的像素值*0.5)+ (彩色圖像該點的像素值*0.5)。

----------------------------------

作者:小斤(陳忻)

新浪圍脖:@小斤陳

本文屬于原創文章,如需轉載引用請注明原文作者和鏈接,謝謝。

總結

以上是生活随笔為你收集整理的由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂91| 毛片免费视频 | 欧美黑人性生活 | 亚洲精品国产欧美 | 97超碰人人模人人人爽人人爱 | 少妇特黄a一区二区三区 | 蜜臀av一区二区三区 | 日韩欧美国产片 | 日韩综合网 | 精品黑人 | 亚洲精品第三页 | 麻豆久久久午夜一区二区 | 日韩精品久久久久久久电影99爱 | 国模一区二区 | 久免费一级suv好看的国产 | 182午夜视频 | 国产夫妻性生活视频 | 在线观看网页视频 | 国产日韩精品一区二区三区在线 | 国产精品嫩 | 欧美xxxxxx片免费播放软件 | 亚洲精品一区二 | 久久国产一级片 | 色片免费观看 | 国内成人免费视频 | 欧美色交| 97国产免费 | 新97超碰| 精品在线免费视频 | jizzjizz8| 欧美日韩中| 亚洲三级影院 | 欧美第一页浮力影院 | 欧美日韩国产综合网 | 性高潮视频在线观看 | 朝鲜女人性猛交 | 人人妻人人藻人人爽欧美一区 | 亚洲性网站| 久久久片 | 国产精品熟女视频 | 五月婷婷激情小说 | 绿帽单男 | 双性皇帝高h喷汁呻吟 | 俺也去综合 | 亚洲精品一区二区在线 | 黄页免费网站 | 久久人妻少妇嫩草av蜜桃 | av伊人久久| 五月天综合婷婷 | 国产麻豆xxxvideo实拍 | 一区二区三区在线免费视频 | 色屁屁ts人妖系列二区 | 久久传媒| 久操伊人网 | 特级西西www444人体聚色 | 在线天堂v | 亚洲一区二区动漫 | 在线观看国产免费av | 亚洲一区二区三区不卡视频 | av女人的天堂 | 成人中文网 | 欧美xxxxx视频| 久久夜色精品国产噜噜亚洲av | 人妻无码中文字幕免费视频蜜桃 | 夜夜添无码一区二区三区 | 自拍偷拍 国产 | 午夜视频a | 亚洲h视频在线观看 | 国产思思99re99在线观看 | 男女做事网站 | 欧洲mv日韩mv国产 | 亚洲AV成人精品 | 激情综合网站 | 亚洲欧美激情另类校园 | 日韩专区一区二区三区 | 国产色影院 | 亚洲专区在线播放 | 少妇搡bbbb搡bbb搡打电话 | 一区二区三区在线观看免费 | 国产精品12区 | 日韩视频久久 | 东京热一区二区三区四区 | 五月婷六月 | 曰韩在线 | 91在线看视频 | 牲欲强的熟妇农村老妇女视频 | av导航网 | 日韩欧洲亚洲AV无码精品 | 成人久久18免费网站图片 | 亚洲中文字幕无码专区 | 亚欧在线视频 | 日韩久久网 | 91色啪 | 国产精品久久久久久亚洲毛片 | 在线观看国产区 | 黄色国产片 | 丁香花电影在线观看免费高清 | 亚洲咪咪 | 黄色一级一级 |