Azure Kinect DK 深度数据获取
一.寻找设备 ,打开设备
我这里使用的是默认的参数,因为我只有一个相机。
二.设置好参数,打开相机
参数的设置要好好选择,因为极大程度的影响你后面使用的一些功效,通过查看官方的硬件文档,可以适当选取合适的参数,我们目前主要关心的应该是深度数据,并且深度数据还有工作范围,不处于正常工作范围内的,可能会导致深度信息检测不出来,我实验的时候太近了的时候,只能检测出外部轮廓,中间的深度信息检测不出来。
三.获取捕捉
相机传感器中的数据一开始都是在捕捉当中,需要先获取捕捉,再进行之后的操作。
四.格式转换
先是从捕捉中获取 深度图像和彩色图像,然后将深度图像和彩色图像转换为opencv格式,注意深度数据是CV_16U,相当于他的最大数据为0-65535,但是为了他能在opencv中显示需把他转换为CV_8U格式,否则会报错。CV转换函数中的最后一个参数可选择为1或者1/255.0 。这代表了他们取值的不同和缩放比例。
五.显示以及释放内存,关闭设备。
opencv中imshow不支持16U的格式,但是为了能在图像中明显的显示深度信息,可以采用三通道8U_C3, 将不同区间端的深度用不同的颜色表示。
下附简单代码。
#pragma comment(lib, "k4a.lib")
#include <stdio.h>
#include <k4a/k4a.h>
#include <k4arecord/record.h>
#include <k4arecord/playback.h>
#include < iostream>
#include <stdlib.h>
#include <opencv2/core/core.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <k4a/k4a.hpp>
#include < cstdlib>
using namespace cv;
using namespace std;
int main()
{
k4a::capture capture;
const uint32_t device_count = k4a::device::get_installed_count();//查看设备个数
if (device_count == 0)
{
printf("No K4A devices found\n");
return 0;
}
k4a::device device = k4a::device::open(K4A_DEVICE_DEFAULT);
k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL; //设定设备参数
config.color_format = K4A_IMAGE_FORMAT_COLOR_BGRA32;
config.color_resolution = K4A_COLOR_RESOLUTION_1080P;
config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;
config.camera_fps = K4A_FRAMES_PER_SECOND_30;
config.synchronized_images_only = true;
device.start_cameras(&config);
k4a::image rgbImage;
k4a::image depthImage;
cv::Mat color_frame;
cv::Mat depth_frame;
while (true)
{
if (device.get_capture(&capture, std::chrono::milliseconds(0)))
{
rgbImage = capture.get_color_image();
depthImage = capture.get_depth_image();
color_frame = cv::Mat(rgbImage.get_height_pixels(), rgbImage.get_width_pixels(), CV_8UC4, rgbImage.get_buffer());
depth_frame = cv::Mat(depthImage.get_height_pixels(), depthImage.get_width_pixels(), CV_16U, depthImage.get_buffer());
depth_frame .convertTo(depth_frame , CV_8U, 1 );
cv::imshow("color", color_frame);
cv::imshow("depth", depth_frame );
color_frame.release();
depth_frame.release();
capture.reset();
if (waitKey(1) == 27)
break;
}
}
cv::destroyAllWindows();
device.close();
return 0;
}