深度和彩色图 canny边缘检测并显示(源代码)


//openni.cpp

#include "stdafx.h"
#include <iostream>
#include <XnCppWrapper.h>
using namespace xn;
using namespace std;


class COpenNI
{
public:
~COpenNI() {
context.Release();//释放空间
}
bool Initial() {
//初始化
status = context.Init();
if(CheckError("Context initial failed!")) {
return false;
}
context.SetGlobalMirror(true);//设置镜像
//产生图片node
status = image_generator.Create(context);
if(CheckError("Create image generator  error!")) {
return false;
}
//产生深度node
status = depth_generator.Create(context);
if(CheckError("Create depth generator  error!")) {
return false;
}
//视角校正
status = depth_generator.GetAlternativeViewPointCap().SetViewPoint(image_generator);
if(CheckError("Can't set the alternative view point on depth generator")) {
return false;
}


return true;


}


bool Start() {
status = context.StartGeneratingAll();
if(CheckError("Start generating error!")) {
return false;
}
return true;
}


bool UpdateData() {
status = context.WaitNoneUpdateAll();
if(CheckError("Update date error!")) {
return false;
}
//获取数据
image_generator.GetMetaData(image_metadata);
depth_generator.GetMetaData(depth_metadata);


return true;
}


public:
DepthMetaData depth_metadata;
ImageMetaData image_metadata;


private:
//该函数返回真代表出现了错误,返回假代表正确
bool CheckError(const char* error) {
if(status != XN_STATUS_OK ) {
//QMessageBox::critical(NULL, error, xnGetStatusString(status));
cerr << error << ": " << xnGetStatusString( status ) << endl;
return true;
}
return false;
}


private:
XnStatus    status;
Context     context;
DepthGenerator  depth_generator;
ImageGenerator  image_generator;
};


//main.cpp

// opencv_kinect.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"




#include <XnCppWrapper.h>   
#include <XnModuleCppInterface.h>    
#include "cv.h"   
#include "highgui.h"  
#include <stdlib.h>
#include <iostream>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <XnCppWrapper.h>


using namespace std;
using namespace cv;
#include "copenni.cpp"


#include <iostream>


using namespace cv;
using namespace xn;


int main (int argc, char **argv)
{
COpenNI openni;
if(!openni.Initial())
return 1;


namedWindow("color image", CV_WINDOW_AUTOSIZE);
namedWindow("color edge detect", CV_WINDOW_AUTOSIZE);
namedWindow("depth image", CV_WINDOW_AUTOSIZE);
namedWindow("depth edge detect", CV_WINDOW_AUTOSIZE);


if(!openni.Start())
return 1;
while(1) {
if(!openni.UpdateData()) {
return 1;
}
/*获取并显示色彩图像*/
Mat color_image_src(openni.image_metadata.YRes(), openni.image_metadata.XRes(),
CV_8UC3, (char *)openni.image_metadata.Data());
Mat color_image;
cvtColor(color_image_src, color_image, CV_RGB2BGR);
imshow("color image", color_image);


/*对色彩图像进行canny边缘检测并显示*/
Mat color_image_gray, color_image_edge;
cvtColor(color_image_src, color_image_gray, CV_RGB2GRAY);//因为在进行边缘检测的时候只能使用灰度图像
Canny(color_image_gray, color_image_edge, 5, 100);
imshow("color edge detect", color_image_edge);


/*获取并显示深度图像*/
Mat depth_image_src(openni.depth_metadata.YRes(), openni.depth_metadata.XRes(),
CV_16UC1, (char *)openni.depth_metadata.Data());//因为kinect获取到的深度图像实际上是无符号的16位数据
Mat depth_image, depth_image_edge;
depth_image_src.convertTo(depth_image, CV_8U, 255.0/8000);
imshow("depth image", depth_image);


/*计算深度图像的canny边缘并显示*/
Canny(depth_image, depth_image_edge, 5, 100);
imshow("depth edge detect", depth_image_edge);
waitKey(30);


}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值