保存Azure Kinect DK拍摄的rgb和depth前景图像

文章目录

  • 前言
  • 一、关键代码
    • 1.获取彩色相机和深度相机拍摄的背景图
    • 2.利用设定的深度阈值获取图像前景
  • 二、展示
    • 1.整体
    • 2.细节
  • 参考

前言

书接上回(多台Azure Kinect DK同步保存RGB和Depth图片),在同步保存多台设备的rgb和depth图像后,后面的任务就是要进行图像分割,因为只需要人体的图像,不需要室内的杂乱背景图像。关于图像分割算法模型(实际上更侧重于语义分割),我还在做调研。因为昨天看到了官方给出的绿幕事例,就想先看看利用设定深度阈值获取到的前景图像效果咋样,所以就有了这篇小记。

这里我就使用了一台Kinect设备看了一下效果

一、关键代码

1.获取彩色相机和深度相机拍摄的背景图

因为不需要杂乱的背景图像,我这里就直接获取设备拍摄的一张背景图像并全部隐藏(这里其实可以直接使用opencv创建自己想要的背景图像)

/* 获取图像背景 */
vector<k4a::capture> background_captures = capturer.get_synchronized_captures(secondary_config);
k4a::image background_main_color_image = background_captures[0].get_color_image();  // 获取背景的color和depth图像
k4a::image background_main_depth_image = background_captures[0].get_depth_image();

cv::Mat background_colorImage = color_to_opencv(background_main_color_image) = 0;  // 转换到opencv中
cv::Mat output_colorImage = background_colorImage.clone();  // 在循环外分配,以避免每次重新创建

cv::Mat background_depth_image = depth_to_opencv(background_main_depth_image) = 0; //将k4a类型转到opencv background_depth_image.size():[1024 x 1024]
//depth图像和color图像不匹配,要放到color空间进行匹配
k4a::image background_depth_in_main_color = create_depth_image_like(background_main_color_image);
main_depth_to_main_color.depth_image_to_color_camera(background_main_depth_image, &background_depth_in_main_color);
cv::Mat backgourd_depthImage = depth_to_opencv(background_depth_in_main_color);
cv::Mat output_depthImage = backgourd_depthImage.clone(); // 在循环外分配,以避免每次重新创建

2.利用设定的深度阈值获取图像前景

在程序中,会设定一个前景深度,

uint16_t depth_threshold = 1000; // 设置前景深度阈值,默认1m

利用这个阈值,就可以获取前景深度阈值内的图像,并以背景图像隐去阈值外的图像

vector<k4a::capture> captures;
captures = capturer.get_synchronized_captures(secondary_config, true);
k4a::image main_color_image = captures[0].get_color_image();
k4a::image main_depth_image = captures[0].get_depth_image();

//记录时间戳
int64_t main_color_image_time = main_color_image.get_device_timestamp().count();
int64_t main_depth_image_time = main_depth_image.get_device_timestamp().count();

// 将主设备的深度图像放入彩色摄像机空间
k4a::image main_depth_in_main_color = create_depth_image_like(main_color_image);
main_depth_to_main_color.depth_image_to_color_camera(main_depth_image, &main_depth_in_main_color);

//获取到的主设备的depth图
cv::Mat cv_main_depth_in_main_color = depth_to_opencv(main_depth_in_main_color); 
//获取到的主设备的rgb图
cv::Mat cv_main_color_image = color_to_opencv(main_color_image); 

//只保留设置深度阈值范围内的图像
cv::Mat within_threshold_range = (cv_main_depth_in_main_color != 0) &
								 (cv_main_depth_in_main_color < depth_threshold);
								
//展示深度阈值以内的color图像
cv_main_color_image.copyTo(output_colorImage, within_threshold_range); 
//隐藏深度阈值以外的color图像
background_colorImage.copyTo(output_colorImage, ~within_threshold_range);

//展示深度阈值以内的depth图像
cv_main_depth_in_main_color.copyTo(output_depthImage, within_threshold_range);
//隐藏深度阈值以外的depth图像
backgourd_depthImage.copyTo(output_depthImage, ~within_threshold_range);   

//保存
std::string filename_main_rgb = std::to_string(main_color_image_time)+".png";
std::string filename_main_depth = std::to_string(main_depth_image_time)+".png";
imwrite("./depth_master/"+filename_main_rgb, output_depthImage);
imwrite("./rgb_master/"+filename_main_depth, output_colorImage);

二、展示

1.整体

保存Azure Kinect DK拍摄的rgb和depth前景图像_第1张图片

2.细节

整体效果如下所示:
保存Azure Kinect DK拍摄的rgb和depth前景图像_第2张图片
保存Azure Kinect DK拍摄的rgb和depth前景图像_第3张图片
感觉边缘锯齿还是挺严重的,而且在前景阈值内,靠近身体边缘的地方还是会出现摄像机拍摄的背景(不是我自己设定的,就是阈值外的背景)。后面还是用分割来做吧,反正我看了几个实时分割模型的视频演示,感觉很不错。

参考

1.https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/examples/green_screen

你可能感兴趣的:(Azure,Kinect,DK,azure,opencv,计算机视觉)