kinect2.0在vs中 按键“0”才能获取拍摄图片的代码

 

注意点:

1、参考的文章是:

Kinect2.0相机标定_framesourcetypes-CSDN博客

2、文章在运行时 报错,已完成代码修改,

在出现C4703报错时

 参考文章:错误C4703:使用了可能未初始化的本地指针变量“m”_严重性代码说明项目文件行禁止显示状态 错误c4703使用了可能未初始化的本-CSDN博客

解决方法

打开项目属性—C/C+±----常规-----SDL检查-----否

 修改后代码

#include "stdafx.h"
#include "kinect.h"
#include <iostream>
#include <opencv2/core/core.hpp>  
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;
using namespace std;

// 安全释放指针
template<class Interface>
inline void SafeRelease(Interface *& pInterfaceToRelease)
{
	if (pInterfaceToRelease != NULL)
	{
		pInterfaceToRelease->Release();
		pInterfaceToRelease = NULL;
	}
}

int main()
{
	// 获取Kinect设备
	IKinectSensor* m_pKinectSensor;
	HRESULT hr;
	hr = GetDefaultKinectSensor(&m_pKinectSensor);
	if (FAILED(hr))
	{
		return hr;
	}

	IMultiSourceFrameReader* m_pMultiFrameReader;
	if (m_pKinectSensor)
	{
		hr = m_pKinectSensor->Open();
		if (SUCCEEDED(hr))
		{
			// 获取多数据源到读取器  
			hr = m_pKinectSensor->OpenMultiSourceFrameReader(
				FrameSourceTypes::FrameSourceTypes_Color |
				FrameSourceTypes::FrameSourceTypes_Infrared |
				FrameSourceTypes::FrameSourceTypes_Depth,
				&m_pMultiFrameReader);
		}
	}

	if (!m_pKinectSensor || FAILED(hr))
	{
		return E_FAIL;
	}
	// 三个数据帧及引用
	IDepthFrameReference* m_pDepthFrameReference;
	IColorFrameReference* m_pColorFrameReference;
	IInfraredFrameReference* m_pInfraredFrameReference;
	IInfraredFrame* m_pInfraredFrame;
	IDepthFrame* m_pDepthFrame;
	IColorFrame* m_pColorFrame;
	// 三个图片格式
	Mat i_rgb(1080, 1920, CV_8UC4);      //注意:这里必须为4通道的图,Kinect的数据只能以Bgra格式传出
	Mat i_depth(424, 512, CV_8UC1);
	Mat i_src_depth(424, 512, CV_16UC1);
	Mat i_ir(424, 512, CV_16UC1);

	UINT16 *depthData = new UINT16[424 * 512];
	IMultiSourceFrame* m_pMultiFrame = nullptr;
	while (true)
	{
		// 获取新的一个多源数据帧
		hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);
		if (FAILED(hr) || !m_pMultiFrame)
		{
			//cout << "!!!" << endl;
			continue;
		}

		// 从多源数据帧中分离出彩色数据,深度数据和红外数据
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_DepthFrameReference(&m_pDepthFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pDepthFrameReference->AcquireFrame(&m_pDepthFrame);
		if (SUCCEEDED(hr))
			hr = m_pMultiFrame->get_InfraredFrameReference(&m_pInfraredFrameReference);
		if (SUCCEEDED(hr))
			hr = m_pInfraredFrameReference->AcquireFrame(&m_pInfraredFrame);

		// color拷贝到图片中
		UINT nColorBufferSize = 1920 * 1080 * 4;
		if (SUCCEEDED(hr))
			hr = m_pColorFrame->CopyConvertedFrameDataToArray(nColorBufferSize, reinterpret_cast<BYTE*>(i_rgb.data), ColorImageFormat::ColorImageFormat_Bgra);

		// depth拷贝到图片中
		if (SUCCEEDED(hr))
		{
			hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, depthData);
			//for (int i = 0; i < 512 * 424; i++)
			//{
			//  // 0-255深度图,为了显示明显,只取深度数据的低8位
			//  BYTE intensity = static_cast<BYTE>(depthData[i] % 256);
			//  reinterpret_cast<BYTE*>(i_depth.data)[i] = intensity;
			//}

			// 实际是16位unsigned int数据
			hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_src_depth.data));
		}

		// infrared拷贝到图片中
		if (SUCCEEDED(hr))
		{
			hr = m_pInfraredFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_ir.data));
		}

		Mat i_rgb_resize = i_rgb.clone();
		cv::resize(i_rgb_resize, i_rgb_resize, Size(512, 424));
		// 显示
		char key_board = waitKey(10);
		imshow("rgb", i_rgb_resize);
		if (key_board == 'w')
			break;                           // 彩色图像
		imshow("i_src_depth", i_src_depth);
		if (waitKey(1) == VK_ESCAPE)
			break;							// 深度图像
		imshow("ir", i_ir);
		if (key_board == 'w')
			break;							// 红外图像
		if (key_board == '0')
		{
			// 定义保存图片的文件夹路径
			std::string colorFolder = "C:\\A0fangfang\\shiyan\\8.5\\right-RGB\\";
			std::string depthFolder = "C:\\A0fangfang\\shiyan\\8.5\\right-shen\\";
			std::string irFolder = "C:\\A0fangfang\\shiyan\\8.5\\right-HW\\";

			

			// 构造文件名,这里简单地使用日期和时间作为文件名的一部分
			std::string colorFilename = colorFolder + "color_" + std::to_string(time(NULL)) + ".png";
			std::string depthFilename = depthFolder + "depth_" + std::to_string(time(NULL)) + ".png";
			std::string irFilename = irFolder + "ir_" + std::to_string(time(NULL)) + ".png";

			// 保存图片
			imwrite(colorFilename, i_rgb_resize);
			imwrite(depthFilename, i_src_depth);
			imwrite(irFilename, i_ir);

			std::cout << "Images saved:" << std::endl;
			std::cout << "Color: " << colorFilename << std::endl;
			std::cout << "Depth: " << depthFilename << std::endl;
			std::cout << "Infrared: " << irFilename << std::endl;
		}
			
																	// 释放资源
		SafeRelease(m_pColorFrame);
		SafeRelease(m_pDepthFrame);
		SafeRelease(m_pInfraredFrame);
		SafeRelease(m_pColorFrameReference);
		SafeRelease(m_pDepthFrameReference);
		SafeRelease(m_pInfraredFrameReference);
		SafeRelease(m_pMultiFrame);
	}
	// 关闭窗口,设备
	cv::destroyAllWindows();
	m_pKinectSensor->Close();
	std::system("pause");
	return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值