五、获取RGB图像——Azure Kinect DK入门
微软 Azure Kinect开发工具文档
微软 Azure Kinect传感器 SDK官方开发文档
OpenCV官方技术文档
在学习过程中参考这些官方文档,并查阅相关资料以加深理解。
获取RGB图像
- 目的
- 设备
- 基本函数
- 代码实现
- 结果
- 总结
目的
- 获取RGB图像
设备
- 一台Azure Kinect DK
基本函数
返回类型 k4a_result_t 的函数 k4a_device_start_cameras 以参数 (设备句柄 device_handle) 和 (常量相机配置指针 config) 开始彩色摄像头与深度传感器的捕获操作。
该函数的功能是 启动彩色摄像头与深度传感器捕获数据。
参数包括:
- 设备句柄 device_handle:指定当前设备的操作
- 相机配置指针 config:包含所需相机设置的信息
- k4a_wait_result_t k4a_device_get_capture(k4a_device_t device_handle ,k4a_capture_t * capture_handle ,int32_t timeout_in_ms)
该函数的功能是实现传感器数据采集过程。
参数包括:
- device_handle:该值用于标识具体的设备实例
- capture_handle:该字段设置了当前传感器捕捉操作的唯一标识符
- timeout_in_ms:此字段指定了函数阻塞等待捕获操作的时间长度(以毫秒表示的时间间隔)
-
k4a_image_t k4a_capture_get_color_image(k4a_capture_t capture_handle)
该函数用于返回与指定捕获相关的彩色图像数据
参数为 capture_handle(表示传感器捕获的句柄) -
void k4a_image_release(k4a_image_t image_handle)
函数作用:负责释放相关图像资源
参数列表:
image_handle字段用于标识待释放的图像资源 -
int k4a_image_get_height_pixels(k4a_image_t *image_handle)
**函数功能:返回图像的高度值(单位:像素)
参数:
image_handle 为图像句柄变量 -
int k4a_image_get_width_pixels(k4a_image_t image_handle)
**详细描述该函数的功能:它返回以像素表示的图像宽度
参数列表:
image_handle 为指向图像句柄的变量指针
uint8_t * k4a_image_get_buffer(k4a_image_t image_handle)
函数功能:返回图像缓冲区
参数列表:
image_handle: 图像句柄
- void k4a_device_stop_cameras(k4a_device_t device_handle)
该函数的功能是关闭所有彩色和深度相机的捕获。
参数如下所述:
- device_handle 为设备句柄标识符。
OpenCV函数:
- namedWindow:创建一个自定义的窗口
- imshow:在指定窗口展示结果
代码实现
代码如下
#include<k4a/k4a.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
system("color 2f");
uint32_t device_number = k4a_device_get_installed_count(); // 识别已连接的设备
if (device_number == 0)
{
cout << "No k4a devices attached!" << endl;
return -1;
}
cout << "已连接设备数:" << device_number << endl;
k4a_device_t device = NULL; // 定义设备句柄
if (K4A_FAILED(k4a_device_open(0, &device))) // 打开设备
{
cout << "Failed to open k4a device!\n" << endl;
return -1;
}
cout << "成功打开设备!" << endl;
size_t serial_size = 0;
k4a_device_get_serialnum(device, NULL, &serial_size); // 获取序列号大小
char* serial = (char*)(malloc(serial_size)); // 开辟空间存储序列号
k4a_device_get_serialnum(device, serial, &serial_size); // 获取序列号
cout << "设备序列号为:" << serial << endl;
free(serial); // 释放为存储序列号开辟的空间
// 启动相机,配置相机参数
k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
config.camera_fps = K4A_FRAMES_PER_SECOND_30;
config.color_format = K4A_IMAGE_FORMAT_COLOR_BGRA32;
config.color_resolution = K4A_COLOR_RESOLUTION_720P;
if (K4A_FAILED(k4a_device_start_cameras(device, &config))) // 开始彩色与深度相机捕捉
{
cout << "Failed to start cameras!" << endl;
k4a_device_close(device);
return -1;
}
cout << "成功打开相机!" << endl;
while (true) // 图像是一帧一帧获取的,故用循环
{
k4a_capture_t sensor_capture; // 定义传感器捕获句柄
k4a_wait_result_t get_capture_result = k4a_device_get_capture(device, &sensor_capture, K4A_WAIT_INFINITE); // 读取传感器捕获,K4A_WAIT_INFINITE:一直等待捕获数据,直到数据可用、设备断开连接或发生其他错误
k4a_image_t rbgimage = k4a_capture_get_color_image(sensor_capture); // 获取RGB图像
// 将相机获取的图像用OpenCV处理然后表示出来
Mat color_image = Mat(k4a_image_get_height_pixels(rbgimage), k4a_image_get_width_pixels(rbgimage), CV_8UC4,k4a_image_get_buffer(rbgimage));
namedWindow("color", WINDOW_FREERATIO); // 定义一个可以自己调节的窗口
imshow("color", color_image); // 展示经处理的图像
if (waitKey(1) == 27) // 如果键盘接受‘ESC’键,退出循环
{
cout << "程序结束" << endl;
break;
}
k4a_image_release(rbgimage); // 释放图像句柄
}
k4a_device_stop_cameras(device); // 关闭相机
k4a_device_close(device); // 关闭设备
waitKey(0);
return 0;
}
结果


总结
- 学习并掌握了十个函数的用法,成功打开相机获取RGB图像
令你倾慕的一切事物背后都暗藏着默默承受的辛劳与付出。那些让你心驰神往的美好事物,并非突如其来的奇迹,而是早做打算的结果
我是 sido ,期待与你共攀高峰
