2021-08-06

Azure Kinect 获取RGB-D图像

Azure Kinect DK 是微软公司发布的一款开发人员工具包,配有先进的 AI 传感器,提供复杂的计算机视觉和语音模型。 Kinect 将深度传感器、空间麦克风阵列与视频摄像头和方向传感器整合成一体式的小型设备,提供多种模式、选项和软件开发工具包 (SDK)。是第三代Kinect深度传感器设备,其搭载了100万像素的深度传感器和1200万像素的RGB深度摄像头,以及红外传感器等。
以下为笔者在Windows上获取RGB-D图像的程序配置过程和获取代码。

前期准备

在使用 Azure Kinect 获取RGB-D图像前,需要安装和配置以下软硬件和数据包:
1.Visual Studio 2019;
2.Opencv3.4.5
3.Azure Kinect DK;

Opencv 配置过程

这一配置过程,本文Opencv配置过程的内容参考:https://blog.csdn.net/maizousidemao/article/details/81474834
1.点击Opencv3.4.5下载页面,下载Opencv3.4.5版。如下所示,双击Windows即可下载。
opencv3.4.5
Opencv安装
双击opencv-3.4.5-vc14_vc15.exe程序以安装opencv,将出现如下界面:
解压界面1
这里可以选择其他磁盘文件夹下,笔者安装在D盘下。
解压界面2
解压后,D盘将出现一个opencv的文件夹,文件夹中有以下文件:
opencv解压后文件
配置系统环境

windows10 20H2版前:在桌面找到“此电脑”,并单击右键,找到属性,在属性界面中找到“高级系统设置”,并打开找到“环境变量”;
20H2版后(通用方法):直接使用windows 10 搜索工具,搜索“编辑系统变量”,即可编辑环境变量;
系统变量搜索
找到系统变量中的path变量,双击它,点击新建,将你解压的opencv文件夹中的下图路径添加到当中,并点“确定”退出配置界面。
在这里插入图片描述

VS环境配置

1、打开Visual Studio 2019 软件,新建一个控制台的空项目;
创建新项目
2、在右侧“解决方案资源管理器”中的“源文件”文件夹下新建一个"c++文件(.cpp)"程序文件,此时,可以选择将后文的代码复制进去(由于没配置环境,将报告大量的错误),或是执行后面的Opencv项目环境配置和Azure Kinect配置过程。
在这里插入图片描述
c++文件

3、Opencv项目环境配置:在菜单栏的“项目”下点击“属性”按钮,进入属性编辑页面;添加属性
4、将运行平台设为“X64”模式,并依次选择“”“VC++目录—>包含目录—>编辑”,添加三个包含文件:
D:\Opencv\opencv\build\include
D:\Opencv\opencv\build\include\opencv
D:\Opencv\opencv\build\include\opencv2
在库目录中加入
D:\Opencv\opencv\build\x64\vc15\lib
在这里插入图片描述5、链接器->输入->附加依赖项中加入
opencv_world345d.lib
添加完成后,点击应用确定。
注意
opencv_world345d.lib为debug版的运行库,如果配置的是release版的,应选择opencv_world345.lib,其他配置环境的和上述的一致。
在这里插入图片描述
Azure Kinect 配置
在Visual Studio软件菜单栏中“项目”选项下选择“管理NuGet程序包(N)”,并搜索“kinect”,选择下图所示的程序包并点击安装即可。
在这里插入图片描述
在这里插入图片描述

Azure Kinect 获取RGB-D程序

获取RGB图像和Depth 图像并显示的源代码如下:

#include<iostream>
#include<string>
#include<chrono>
#include<io.h>
#include<direct.h>
//opencv
#include<opencv2/opencv.hpp>
//Kinect DK
#pragma comment(lib,"k4a.lib")
#include<k4a/k4a.hpp>

int main()
{
	//Connecting device
	const uint32_t device_count = k4a::device::get_installed_count();
	if (device_count == 0) {
		std::cout << "Error:no K4A devices found." << std::endl;
		return -1;
	}
	//open device 
	k4a::device device = k4a::device::open(K4A_DEVICE_DEFAULT);
	std::cout << "Done:open device." << std::endl;
	//setting camera parameter
	k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
	config.camera_fps = K4A_FRAMES_PER_SECOND_30;//30fps
	config.color_format = K4A_IMAGE_FORMAT_COLOR_BGRA32;//color_format rgba
	config.color_resolution = K4A_COLOR_RESOLUTION_1080P;//1080p
	config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;//depth mode
	config.synchronized_images_only = true;
	device.start_cameras(&config);
	std::cout << "Done:start camera." << std::endl;
	//Get capture from device
	k4a::capture capture;
	k4a::image rgbImage;
	k4a::image depthImage;
	k4a::image transformed_depthImage;
	cv::Mat cv_rgbImage_with_alpha;
	cv::Mat cv_rgbImage_no_alpha;
	cv::Mat cv_depth;
	cv::Mat cv_depth_8U;

	//data collected
	while (true)
	{
		if (device.get_capture(&capture))
		{
			//get rgb data flush
			rgbImage = capture.get_color_image();
			//get depth data flush
			depthImage = capture.get_depth_image();
			//
			//depth image and rgb image transformation
			k4a::calibration k4aCalibration = device.get_calibration(config.depth_mode, config.color_resolution);
			k4a::transformation k4aTransformation = k4a::transformation(k4aCalibration);
			transformed_depthImage = k4aTransformation.depth_image_to_color_camera(depthImage);
			cv_rgbImage_with_alpha = cv::Mat(rgbImage.get_height_pixels(), rgbImage.get_width_pixels(), CV_8UC4, (void*)rgbImage.get_buffer());
			cv::cvtColor(cv_rgbImage_with_alpha, cv_rgbImage_no_alpha, cv::COLOR_BGRA2BGR);
			cv_depth = cv::Mat(transformed_depthImage.get_height_pixels(), transformed_depthImage.get_width_pixels(), CV_16U,
				(void*)transformed_depthImage.get_buffer(), static_cast<size_t>(transformed_depthImage.get_stride_bytes()));
			cv_depth.convertTo(cv_depth_8U, CV_8U, 1);
			//display image
			cv::imshow("color Image", cv_rgbImage_no_alpha);
			cv::waitKey(1);
			cv::imshow("depth Image", cv_depth_8U);
			cv::waitKey(1);
			//save image
			double time_rgb = static_cast<double>(std::chrono::duration_cast<std::chrono::microseconds>(
				rgbImage.get_device_timestamp()).count());
			double date = 1;
			std::string filename_rgb = std::to_string(time_rgb / 1000000) + ".png";
			double time_d = static_cast<double>(std::chrono::duration_cast<std::chrono::microseconds>(
				depthImage.get_device_timestamp()).count());
			std::string filename_d = std::to_string(time_d / 1000000) + ".png";			
			imwrite("./rgb/" + filename_rgb, cv_rgbImage_no_alpha);
			imwrite("./depth/" + filename_d, cv_depth_8U);

			std::cout << "Acquiring!" << std::endl;
			//Release variable
			cv_rgbImage_with_alpha.release();
			cv_rgbImage_no_alpha.release();
			cv_depth.release();
			cv_depth_8U.release();
			capture.reset();
		}
		else
		{
			std::cout << "false: K4A_WAIT_RESULT_TIMEOUT." << std::endl;
		}
	}
	//closed windows
	cv::destroyAllWindows();
	//release variable
	rgbImage.reset();
	depthImage.reset();
	capture.reset();
	device.close();
	return 1;

}

复制代码后,点击运行即可。
注意
在运行前记得将解决方案平台选择“X64”模式,同时记得配置为Release模式时,应该把下图的“Debug”改成"Release"。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值