【Kinect】5th-Kinect深度图像采集和Opencv差帧法运动目标检测
来源:互联网 发布:linux子目录权限 编辑:程序博客网 时间:2024/05/17 01:13
Kinect深度图像采集和Opencv差帧法运动目标检测
#include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp>using namespace std;using namespace cv;class FrameSubtractionKinect{public: void ImageOperation(Mat& depthimage, Mat& frame_0, int& num, int& steadyCount);};int main(int argc, char*argv[])//int类型的argc,用来统计程序运行时发送给main函数的命令行参数的个数。 //char*类型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。{ Mat image, frame_0; int num = 1; int steadyCount = 0; FrameSubtractionKinect detect; image.create(240, 320, CV_8UC1);//灰度图表示深度图像 //1.初始化NUI,传入Depth HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH); if (FAILED(hr)) { cout << "NuiInitialize failed" << endl; return hr; } //2.定义事件句柄 HANDLE nextColorFrameEvent = CreateEvent(NULL,TRUE,FALSE,NULL); HANDLE depthStreamHandle = NULL; //3.打开KINECT设备的深度图信息通道,用depthStreamHandle保存该流的句柄 hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_320x240, 0, 2, nextColorFrameEvent, &depthStreamHandle); if (FAILED(hr)) { cout << "Could not open color image stream video" << endl; NuiShutdown(); return hr; } namedWindow("depthImage", CV_WINDOW_AUTOSIZE); //4.开始读取深度数据 while (1) { const NUI_IMAGE_FRAME *pImageFrame = NULL; //4.1.无限等待新的数据,等到后返回 if (WaitForSingleObject(nextColorFrameEvent, INFINITE) == 0) { //4.2.从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存到pImageFrame hr = NuiImageStreamGetNextFrame(depthStreamHandle, 0, &pImageFrame); if (FAILED(hr)) { cout << "Could not get depth image" << endl; NuiShutdown(); return -1; } INuiFrameTexture *pTexture = pImageFrame->pFrameTexture; NUI_LOCKED_RECT LockedRect; //4.3.提取数据帧到LockedRect,包括两个数据对象(pitch每行字节数,pBits第一个字节地址) pTexture->LockRect(0,&LockedRect,NULL,0); //锁定数据,读数据时,Kinect就不会去修改 //4.4.确定获得的数据是否有效 if (LockedRect.Pitch != 0) { //4.5.将数据转换为OpenCV的Mat格式 //每个深度数据是2个字节,pitch以字节为单位的,地址的偏移是按LockedRect.pBits的地址类型偏移 for (int i = 0; i < image.rows; i++) { uchar *ptr = image.ptr<uchar>(i); //第i行的指针 uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i*LockedRect.Pitch; USHORT *pBuffer = (USHORT*)pBufferRun; for (int j = 0; j < image.cols; j++) { ptr[j] = 255 - (uchar)(256 * pBuffer[j] / 0x0fff); //直接将数据归一化 } } imshow("depthImage", image); detect.ImageOperation(image, frame_0, num, steadyCount); } else { cout << "Buffer length of received texture is bogus" << endl; } //5.处理完解锁 pTexture->UnlockRect(0); //6.释放本帧数据 NuiImageStreamReleaseFrame(depthStreamHandle,pImageFrame); } if (cvWaitKey(20) == 27) break; } //Nui关闭 NuiShutdown(); return 0;}//二差帧法检测运动目标void FrameSubtractionKinect::ImageOperation(Mat& depthimage, Mat& frame_0, int& num, int& steadyCount){ Mat erodeimage; Mat background, foreground, foreground_BW; if (num == 1) { background = depthimage.clone(); frame_0 = background; } else { background = frame_0; frame_0 = depthimage.clone(); } absdiff(depthimage, background, foreground); erode(foreground, erodeimage, getStructuringElement(MORPH_RECT, Size(7, 7))); threshold(erodeimage, foreground_BW, 15, 255, 0); //imshow("foreground", foreground); //imshow("ErodeImage", erodeimage); imshow("foreground_BW", foreground_BW); num++; if (num > 2000000000) num = 10;}
0 0
- 【Kinect】5th-Kinect深度图像采集和Opencv差帧法运动目标检测
- Kinect深度图像采集和Opencv差帧法运动目标检测
- kinect+openni获取kinect的颜色图像和深度图像
- Kinect深度图像滤波
- OpenNI+OpenCV对Kinect采集的彩色图和深度图进行滤波
- OpenNI+OpenCV对Kinect采集的彩色图和深度图进行滤波
- OpenCV--鼠标响应Kinect彩色图像显示深度信息
- kinect,openni,opencv 获取并显示深度与彩色图像
- Kinect 2 SDK + OpenCV 获取深度彩色图像
- OpenNI结合OpenCV显示Kinect彩色、深度及融合图像
- Kinect sdk 2.0 + Opencv 获取深度图像并保存
- Kinect采集彩图和深度图并通过Socket传输
- 如何使用Kinect显示彩色图像和深度图像。
- ROS使用openni获取Kinect彩色图像和深度图像
- 【Kinect】4th-深度数据的处理
- OpenCV运动目标检测
- opencv 运动目标检测
- opencv2.3读取kinect深度信息和彩色图像
- Swt Jface TreeViewer Selection
- 主题建模入门指南(python)
- 60. Permutation Sequence -Medium
- parrallel python study notes
- Angular.js之指令学习笔记
- 【Kinect】5th-Kinect深度图像采集和Opencv差帧法运动目标检测
- ubuntu环境下访问windows共享目录
- 实现App跳转到应用商店
- 一款高质的棋牌游戏具有哪些特点
- ubuntu下mysql的常用命令
- 《懒人Shell脚本》之七——格式化处理数据存入数据库实现
- 抽奖demo
- 从另外一个窗体程序中控制naviswork中的视图
- Tomcat部署无乱码,换成glassfish就发生乱码的解决方法