#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Azure Kinect SDK 1.4.0 图像获取示例 这个示例展示了如何使用pyKinectAzure库来获取Azure Kinect DK传感器的各种图像数据: - 彩色图像 (Color Image) - 深度图像 (Depth Image) - 红外图像 (Infrared Image) - 彩色深度图像 (Colored Depth Image) 要求: - Azure Kinect SDK 1.4.0 - pykinect_azure库 - OpenCV (cv2) - numpy 使用方法: 1. 确保Azure Kinect DK设备已连接 2. 运行脚本: python azure_kinect_image_example.py 3. 按 'q' 键退出程序 4. 按 '1' 键切换到彩色图像模式 5. 按 '2' 键切换到深度图像模式 6. 按 '3' 键切换到红外图像模式 7. 按 '4' 键切换到彩色深度图像模式 8. 按 's' 键保存当前图像 """ import cv2 import numpy as np import os from datetime import datetime try: import pykinect_azure as pykinect except ImportError: print("错误: 无法导入pykinect_azure库") print("请使用以下命令安装: pip install pykinect_azure") exit(1) class AzureKinectImageCapture: """Azure Kinect图像捕获类""" def __init__(self): self.device = None self.current_mode = 1 # 1:彩色, 2:深度, 3:红外, 4:彩色深度 self.save_counter = 0 # 创建保存图像的目录 self.save_dir = "captured_images" if not os.path.exists(self.save_dir): os.makedirs(self.save_dir) def initialize_device(self): """初始化Azure Kinect设备""" try: # 初始化库,解决"Compatible Azure Kinect SDK not found"兼容性问题 # # 方法1: 自动检测(可能遇到版本兼容性问题) # pykinect.initialize_libraries() # # 方法2: 手动指定路径(推荐,解决版本兼容性问题) # 可选的SDK路径(按优先级排序): import platform import os sdk_paths = [] if platform.system() == "Windows": # Orbbec SDK K4A Wrapper(推荐) sdk_paths.append(r"D:\OrbbecSDK_K4A_Wrapper_v1.10.3_windows_202408091749\bin\k4a.dll") else: # Linux路径 sdk_paths.extend([ "/usr/lib/x86_64-linux-gnu/libk4a.so", "/usr/local/lib/libk4a.so" ]) # 尝试使用可用的SDK路径 sdk_initialized = False for sdk_path in sdk_paths: if os.path.exists(sdk_path): try: print(f"尝试使用SDK路径: {sdk_path}") pykinect.initialize_libraries(module_k4a_path=sdk_path) print(f"✓ 成功使用SDK: {sdk_path}") sdk_initialized = True break except Exception as e: print(f"✗ SDK路径失败: {sdk_path} - {e}") continue # 如果所有手动路径都失败,尝试自动检测 if not sdk_initialized: try: print("尝试自动检测SDK...") pykinect.initialize_libraries() print("✓ 自动检测SDK成功") sdk_initialized = True except Exception as e: print(f"✗ 自动检测失败: {e}") if not sdk_initialized: raise Exception("无法初始化Azure Kinect SDK。请检查SDK安装或手动指定正确的路径。") # 配置设备参数 device_config = pykinect.default_configuration device_config.color_resolution = pykinect.K4A_COLOR_RESOLUTION_1080P # 1080p彩色分辨率 device_config.depth_mode = pykinect.K4A_DEPTH_MODE_WFOV_2X2BINNED # 宽视场深度模式 device_config.camera_fps = pykinect.K4A_FRAMES_PER_SECOND_30 # 30 FPS device_config.synchronized_images_only = True # 同步图像 print("设备配置:") print(device_config) # 启动设备 self.device = pykinect.start_device(config=device_config) print("Azure Kinect设备初始化成功!") return True except Exception as e: print(f"设备初始化失败: {e}") print("请确保:") print("1. Azure Kinect DK设备已正确连接") print("2. Azure Kinect SDK 1.4.0已正确安装") print("3. 设备驱动程序已安装") return False def get_color_image(self): """获取彩色图像""" capture = self.device.update() ret, color_image = capture.get_color_image() return ret, color_image def get_depth_image(self): """获取原始深度图像""" capture = self.device.update() ret, depth_image = capture.get_depth_image() return ret, depth_image def get_colored_depth_image(self): """获取彩色深度图像""" capture = self.device.update() ret, colored_depth_image = capture.get_colored_depth_image() return ret, colored_depth_image def get_infrared_image(self): """获取红外图像""" capture = self.device.update() ret, ir_image = capture.get_ir_image() return ret, ir_image def save_image(self, image, mode_name): """保存图像到文件""" timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"{mode_name}_{timestamp}_{self.save_counter:03d}.png" filepath = os.path.join(self.save_dir, filename) cv2.imwrite(filepath, image) print(f"图像已保存: {filepath}") self.save_counter += 1 def display_instructions(self): """显示操作说明""" instructions = [ "=== Azure Kinect 图像捕获示例 ===", "操作说明:", "1 - 切换到彩色图像模式", "2 - 切换到深度图像模式", "3 - 切换到红外图像模式", "4 - 切换到彩色深度图像模式", "s - 保存当前图像", "q - 退出程序", "=================================" ] for instruction in instructions: print(instruction) def run(self): """运行主循环""" if not self.initialize_device(): return self.display_instructions() # 创建窗口 cv2.namedWindow('Azure Kinect Image', cv2.WINDOW_NORMAL) cv2.resizeWindow('Azure Kinect Image', 1280, 720) mode_names = { 1: "Color Image", 2: "Depth Image", 3: "Infrared Image", 4: "Colored Depth Image" } print(f"\n当前模式: {mode_names[self.current_mode]}") while True: try: # 根据当前模式获取相应图像 if self.current_mode == 1: ret, image = self.get_color_image() elif self.current_mode == 2: ret, image = self.get_depth_image() if ret: # 将深度图像转换为可视化格式 image = cv2.convertScaleAbs(image, alpha=0.05) elif self.current_mode == 3: ret, image = self.get_infrared_image() if ret: # 将红外图像转换为可视化格式 image = cv2.convertScaleAbs(image, alpha=0.5) elif self.current_mode == 4: ret, image = self.get_colored_depth_image() if not ret: continue # 在图像上添加模式信息 mode_text = f"Mode: {mode_names[self.current_mode]}" cv2.putText(image, mode_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA) # 显示图像 cv2.imshow('Azure Kinect Image', image) # 处理按键 key = cv2.waitKey(1) & 0xFF if key == ord('q'): print("退出程序...") break elif key == ord('1'): self.current_mode = 1 print(f"切换到: {mode_names[self.current_mode]}") elif key == ord('2'): self.current_mode = 2 print(f"切换到: {mode_names[self.current_mode]}") elif key == ord('3'): self.current_mode = 3 print(f"切换到: {mode_names[self.current_mode]}") elif key == ord('4'): self.current_mode = 4 print(f"切换到: {mode_names[self.current_mode]}") elif key == ord('s'): self.save_image(image, mode_names[self.current_mode].replace(" ", "_")) except KeyboardInterrupt: print("\n程序被用户中断") break except Exception as e: print(f"运行时错误: {e}") break # 清理资源 cv2.destroyAllWindows() print("程序结束") def main(): """主函数""" print("Azure Kinect SDK 1.4.0 图像获取示例") print("作者: AI Assistant") print("版本: 1.0\n") # 创建并运行图像捕获实例 capture = AzureKinectImageCapture() capture.run() if __name__ == "__main__": main()