RealSense、ZED 和奥比中光Astra几款主流相机介绍及应用

发布于:2024-10-09 ⋅ 阅读:(10) ⋅ 点赞:(0)

以下是英特尔 RealSense、Stereolabs ZED 和奥比中光Astra几款相机的详细对比,包括参数、性能以及二次开发等支持,附带代码示例。

详细信息对比和二次开发示例

1. 英特尔 RealSense (例如 D435/D455)

  • 深度技术:立体视觉 + 红外投影
  • 分辨率
    • D435: 1280x720 @ 30fps
    • D455: 1920x1080 @ 30fps
  • 工作范围:0.2 米到 10 米
  • 视场角 (FOV):宽度 86°,高度 57°
  • 通讯接口:USB 3.0
  • SDK 支持Intel RealSense SDK
  • 二次开发支持:C++, Python, ROS 等
  • 安装依赖
pip install pyrealsense2

代码示例(Python)

import pyrealsense2 as rs
import numpy as np
import cv2

# 创建管道
pipeline = rs.pipeline()

# 配置流
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# 启动流
pipeline.start(config)

try:
    while True:
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()

        if not depth_frame or not color_frame:
            continue

        # 将帧转换为numpy数组
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        # 显示图像
        cv2.imshow('Color', color_image)
        cv2.imshow('Depth', depth_image)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    pipeline.stop()
    cv2.destroyAllWindows()

代码示例(C++)

#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API
#include <iostream>

int main() {
    // Create a RealSense pipeline
    rs2::pipeline p;

    // Start the pipeline with default configuration
    p.start();

    while (true) {
        // Wait for a new frame
        rs2::frameset frames = p.wait_for_frames();

        // Get the depth frame
        rs2::depth_frame depth = frames.get_depth_frame();
        // Get the color frame
        rs2::frame color = frames.get_color_frame();

        if (!depth || !color) continue;

        // Get the dimensions of the image
        int width = depth.get_width();
        int height = depth.get_height();

        std::cout << "Depth Frame: " << width << "x" << height << std::endl;

        // Process the images (for demonstration, we just print the size)
        // Here you can add your own image processing code

        // Break the loop on a specific condition (e.g., pressing a key)
        // For this example, we'll just run indefinitely
    }

    return 0;
}

2. ZED (Stereolabs)

  • 深度技术:立体视觉 + IMU
  • 分辨率
    • ZED 2: 4416x1242 @ 15fps(720p模式约 60fps)
  • 工作范围:0.5 米到 20 米
  • 视场角 (FOV):水平 110°,垂直 75°
  • 通讯接口:USB 3.0
  • SDK 支持ZED SDK
  • 二次开发支持:C++, Python, Unity, ROS 等
    安装依赖
    参考 ZED SDK 安装指南

代码示例(Python)

import sys
import time
import pyzed.sl as sl

# 创建相机对象
zed = sl.Camera()

# 配置相机
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD720
init_params.depth_mode = sl.DEPTH_MODE.PERFORMANCE
zed.open(init_params)

while True:
    # 捕获图像
    if zed.grab() == sl.ERROR_CODE.SUCCESS:
        image = sl.Mat()
        zed.retrieve_image(image, sl.VIEW.COLOR)
        depth = sl.Mat()
        zed.retrieve_measure(depth, sl.MEASURE.DEPTH)

        # 获取图像数据
        image_ocv = image.get_data()
        depth_ocv = depth.get_data()

        # 显示图像
        cv2.imshow("ZED Color", image_ocv)
        cv2.imshow("ZED Depth", depth_ocv)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 关闭相机
zed.close()

代码示例(C++)

#include <sl/Camera.hpp>

int main(int argc, char **argv) {
    sl::Camera zed;
    sl::InitParameters init_params;
    init_params.camera_resolution = sl::RESOLUTION::HD720;
    init_params.depth_mode = sl::DEPTH_MODE::PERFORMANCE;

    // 开始相机
    if (zed.open(init_params) != sl::ERROR_CODE::SUCCESS) {
        std::cerr << "Error opening ZED camera." << std::endl;
        return EXIT_FAILURE;
    }

    sl::Mat image, depth;

    while (true) {
        if (zed.grab() == sl::ERROR_CODE::SUCCESS) {
            zed.retrieveImage(image, sl::VIEW::LEFT);
            zed.retrieveMeasure(depth, sl::MEASURE::DEPTH);

            // 显示图像和深度
            cv::imshow("ZED Image", image.getCvMat());
            cv::imshow("ZED Depth", depth.getCvMat());

            if (cv::waitKey(1) == 'q') break;
        }
    }
    zed.close();
    return EXIT_SUCCESS;
}

3. 奥比中光(Orbbec)

  • 深度技术:结构光
  • 分辨率
    • Astra: 640x480 @ 30fps
    • Astra Pro: 1280x720 @ 30fps
  • 工作范围:0.4 米到 8 米
  • 视场角 (FOV):水平 60°,垂直 49°
  • 通讯接口:USB 2.0 / USB 3.0
  • SDK 支持奥比中光 SDK
  • 二次开发支持:C++, C#, Python, Unity 等
  • 安装依赖
    参考 奥比中光 SDK 安装指南

代码示例(Python)

import numpy as np
import cv2
import openni2

# 初始化
openni2.initialize()
dev = openni2.Device.open_any()
depth_stream = dev.create_depth_stream()
color_stream = dev.create_color_stream()

# 开启流
depth_stream.start()
color_stream.start()

while True:
    depth_frame = depth_stream.read_frame()
    color_frame = color_stream.read_frame()

    depth_data = np.frombuffer(depth_frame.get_buffer_as_uint16(), dtype=np.uint16)
    color_data = np.frombuffer(color_frame.get_buffer_as_uint8(), dtype=np.uint8)

    # 处理深度数据
    depth_image = depth_data.reshape((depth_frame.height, depth_frame.width))
    color_image = color_data.reshape((color_frame.height, color_frame.width, 3))

    # 显示图像
    cv2.imshow('Color Image', color_image)
    cv2.imshow('Depth Image', depth_image)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 停止流
depth_stream.stop()
color_stream.stop()
openni2.unload()

代码示例(C++)

#include <OpenNI.h>
#include <iostream>

int main() {
    openni::OpenNI::initialize();
    openni::Device device;
    if (device.open(openni::ANY_DEVICE) != openni::STATUS_OK) {
        std::cerr << "Could not open device." << std::endl;
        return -1;
    }

    openni::VideoStream depthStream, colorStream;
    depthStream.create(device, openni::SENSOR_DEPTH);
    colorStream.create(device, openni::SENSOR_COLOR);

    depthStream.start();
    colorStream.start();

    openni::VideoFrameRef depthFrame, colorFrame;

    while (true) {
        depthStream.readFrame(&depthFrame);
        colorStream.readFrame(&colorFrame);

        // 显示深度和颜色
        // 需添加显示代码 (如使用 OpenCV)
        
        if (/* 检测退出条件 */) break;
    }

    depthStream.stop();
    colorStream.stop();
    device.close();
    openni::OpenNI::shutdown();
    return 0;
}

综合参数对比

参数 英特尔 RealSense Stereolabs ZED 奥比中光
深度技术 立体视觉 + 红外投影 立体视觉 + IMU 结构光
分辨率 D435: 1280x720; D455: 1920x1080 ZED 2: 4416x1242 Astra: 640x480; Pro: 1280x720
工作范围 0.2 米到 10 米 0.5 米到 20 米 0.4 米到 8 米
视场角 (FOV) 86° x 57° 110° x 75° 60° x 49°
通讯接口 USB 3.0 USB 3.0 USB 2.0 / USB 3.0
SDK Intel RealSense SDK ZED SDK 奥比中光 SDK
二次开发支持 丰富的文档与社区 详细API与示例 文档与多平台支持
参数 Intel RealSense D435i ZED Mini 奥比中光 Astra Pro
分辨率 1280x720 (RGB), 640x480 (Depth) 1280x720 (RGB), 720p (Depth) 1280x720 (RGB), 640x480 (Depth)
深度范围 0.3m - 10m 0.3m - 20m 0.5m - 8m
帧率 30 fps (depth + RGB) 60 fps (depth + RGB) 30 fps (depth + RGB)
通讯接口 USB 3.0 USB 3.0 USB 3.0
视场角 69.4° x 42.5° 110° x 80° 90° x 60°

综合性能对比

  • 计算能力:

    • RealSense 配备 IMU,适合移动设备和机器人。
    • ZED 提供高精度深度数据和较大的视场角,适合 AR/VR 应用。
    • 奥比中光专注于深度图像和手势识别等应用,适合人机交互。
  • 使用场景:

    • RealSense: 机器人视觉、手势识别。
    • ZED: 虚拟现实、增强现实、3D 映射。
    • 奥比中光: 智能家居、互动游戏。

总结

以上是对三种不同厂家相机的基本信息对比及二次开发示例,可作为小白简单了解和熟悉。不同的项目需求可以选择不同的相机,根据具体应用场景进行开发。