深度颜色2

来源:互联网 发布:假面骑士wizard知乎 编辑:程序博客网 时间:2024/06/01 13:28
// depth_color.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>  #include <iostream>   #include <NuiApi.h>  #include <opencv2/opencv.hpp>  using namespace std;using namespace cv;static float Depth_value;//bool tracked[NUI_SKELETON_COUNT] = { FALSE };//CvPoint skeletonPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT] = { cvPoint(0,0) };//CvPoint colorPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT] = { cvPoint(0,0) };void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage);void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage);//void getSkeletonImage(HANDLE &skeletonEvent, Mat &skeletonImage, Mat &colorImage, Mat &depthImage);//void drawSkeleton(Mat &image, CvPoint pointSet[], int witchone);//void getTheContour(Mat &image, int whichone, Mat &mask);int main(int argc, char *argv[]){Mat colorImage;colorImage.create(480, 640, CV_8UC3);Mat depthImage;depthImage.create(480, 640, CV_8UC1);//Mat skeletonImage;//skeletonImage.create(240, 320, CV_8UC3);//Mat mask;//mask.create(240, 320, CV_8UC3);HANDLE colorEvent = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE depthEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//HANDLE skeletonEvent = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE colorStreamHandle = NULL;HANDLE depthStreamHandle = NULL;HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH);if (hr != S_OK){cout << "NuiInitialize failed" << endl;return hr;}hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NULL, 4, colorEvent, &colorStreamHandle);if (hr != S_OK){cout << "Open the color Stream failed" << endl;NuiShutdown();return hr;}hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_640x480, NULL, 2, depthEvent, &depthStreamHandle);if (hr != S_OK){cout << "Open the depth Stream failed" << endl;NuiShutdown();return hr;}/*hr = NuiSkeletonTrackingEnable(skeletonEvent, 0);//打开骨骼跟踪事件if (hr != S_OK){cout << "NuiSkeletonTrackingEnable failed" << endl;NuiShutdown();return hr;}*///namedWindow("mask", CV_WINDOW_AUTOSIZE);namedWindow("colorImage", CV_WINDOW_AUTOSIZE);//namedWindow("depthImage", CV_WINDOW_AUTOSIZE);//namedWindow("skeletonImage", CV_WINDOW_AUTOSIZE);while (1){if (WaitForSingleObject(colorEvent, 0) == 0){getColorImage(colorEvent, colorStreamHandle, colorImage);}if (WaitForSingleObject(depthEvent, 0) == 0){getDepthImage(depthEvent, depthStreamHandle, depthImage);}imshow("colorImage", colorImage);if (cvWaitKey(1) == 27)break;}NuiShutdown();return 0;}void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage){const NUI_IMAGE_FRAME *colorFrame = NULL;NuiImageStreamGetNextFrame(colorStreamHandle, 0, &colorFrame);INuiFrameTexture *pTexture = colorFrame->pFrameTexture;NUI_LOCKED_RECT LockedRect;pTexture->LockRect(0, &LockedRect, NULL, 0);if (LockedRect.Pitch != 0){for (int i = 0; i<colorImage.rows; i++){uchar *ptr = colorImage.ptr<uchar>(i);  //第i行的指针                    //每个字节代表一个颜色信息,直接使用uchar  uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;for (int j = 0; j<colorImage.cols; j++){ptr[3 * j] = pBuffer[4 * j];  //内部数据是4个字节,0-1-2是BGR,第4个现在未使用   ptr[3 * j + 1] = pBuffer[4 * j + 1];ptr[3 * j + 2] = pBuffer[4 * j + 2];}}Point center = Point(colorImage.cols / 2, colorImage.rows / 2);int r = 1;circle(colorImage, center, r, Scalar(255, 255, 255));char output[100] = { 0 };char p[100] = { 0 };sprintf_s(p, "Height");char m[100] = { 0 };sprintf_s(m, "Distance");char t[100] = { 0 };sprintf_s(t, "Gesture");sprintf_s(output, "C:\\Users\\Administrator\\Desktop\\kinect\\%s_%d_%s_%d_%s_%d.jpg", p, 1, m, 1, t, 1);imwrite(output, colorImage);//rectangle(colorImage, Point(colorImage.rows / 2 - 1, colorImage.cols / 2 - 1), Point(colorImage.rows / 2 + 1, colorImage.cols / 2 + 1), Scalar(255, 255, 255));}else{cout << "捕捉色彩图像出现错误" << endl;}pTexture->UnlockRect(0);NuiImageStreamReleaseFrame(colorStreamHandle, colorFrame);}void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage){const NUI_IMAGE_FRAME *depthFrame = NULL;NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame);INuiFrameTexture *pTexture = depthFrame->pFrameTexture;NUI_LOCKED_RECT LockedRect;pTexture->LockRect(0, &LockedRect, NULL, 0);if (LockedRect.Pitch != 0){for (int i = 0; i<depthImage.rows; i++){uchar *ptr = depthImage.ptr<uchar>(i);uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;USHORT *pBuffer = (USHORT*)pBufferRun;for (int j = 0; j<depthImage.cols; j++){if (i == 240){//stringstream depth_value;//depth_value << (float)pBuffer[depthImage.cols / 2] / 0x7fff * 0x0fff;//cout << ((float)pBuffer[depthImage.cols / 2]*0.123138 +162.7355 )<< endl;// / 0x7fff * 0x0fffDepth_value = ((float)pBuffer[depthImage.cols / 2] * 0.123138 + 162.7355);ptr[j] = (uchar)(256 * pBuffer[j] / 0x7fff);}else{ptr[j] = (uchar)(256 * pBuffer[j] / 0x7fff);  //直接将数据归一化处理}}}//imshow("depthImage", depthImage);Mat img_pseudocolor(depthImage.rows, depthImage.cols, CV_8UC3);//构造RGB图像,参数CV_8UC3教程文档里面有讲解  int tmp = 0;for (int y = 0; y<depthImage.rows; y++)//转为伪彩色图像的具体算法  {for (int x = 0; x<depthImage.cols; x++){double L = 256;tmp = depthImage.at<unsigned char>(y, x);if (tmp < L / 4){img_pseudocolor.at<Vec3b>(y, x)[0] = L; //blue  img_pseudocolor.at<Vec3b>(y, x)[1] = 0; //green  img_pseudocolor.at<Vec3b>(y, x)[2] = 4 * tmp; //red  }else if (tmp < L / 2){img_pseudocolor.at<Vec3b>(y, x)[0] = L; //blue  img_pseudocolor.at<Vec3b>(y, x)[1] = 4 * (L / 2 - tmp); //green  img_pseudocolor.at<Vec3b>(y, x)[2] = 0; //red  }else if (tmp < 3 * L / 4){img_pseudocolor.at<Vec3b>(y, x)[0] = 4 * (L / 2 - tmp); //blue  img_pseudocolor.at<Vec3b>(y, x)[1] = 0; //green  img_pseudocolor.at<Vec3b>(y, x)[2] = L; //red  }else{img_pseudocolor.at<Vec3b>(y, x)[0] = 0; //blue  img_pseudocolor.at<Vec3b>(y, x)[1] = 4 * (L - tmp); //green  img_pseudocolor.at<Vec3b>(y, x)[2] = L; //red }}}namedWindow("img_pseudocolor");Point center = Point(img_pseudocolor.cols / 2, 240);int r = 1;circle(img_pseudocolor, center, r, Scalar(255, 255, 255));stringstream depth_value;depth_value << Depth_value;putText(img_pseudocolor, depth_value.str(), center, CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255));imshow("img_pseudocolor", img_pseudocolor);char output[100] = { 0 };char p[100] = { 0 };sprintf_s(p, "Height");char m[100] = { 0 };sprintf_s(m, "Distance");char t[100] = { 0 };sprintf_s(t, "Gesture");sprintf_s(output, "C:\\Users\\Administrator\\Desktop\\kinect\\%s_%d_%s_%d_%s_%d_%d.jpg", p, 1, m, 1, t, 1, 1);imwrite(output, img_pseudocolor);}else{cout << "捕捉深度图像出现错误" << endl;}pTexture->UnlockRect(0);NuiImageStreamReleaseFrame(depthStreamHandle, depthFrame);}

原创粉丝点击