You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt3D QML中用Intel RealSense相机RGB数据替换网格材质颜色

如何将Intel RealSense RGB数据作为材质应用到Qt3D MeshViewer

1. 转换RealSense RGB帧为Qt可识别格式

从RealSense SDK获取RGB视频帧后,将像素数据转为QImage格式。RealSense的RGB帧一般为RGB8格式,对应Qt的QImage::Format_RGB888,若渲染时坐标系不匹配,记得镜像翻转图像:

rs2::video_frame rgb_frame = ...; // 从RealSense管道获取实时RGB帧
const int w = rgb_frame.get_width();
const int h = rgb_frame.get_height();
// 转换为QImage,根据渲染需求决定是否镜像
QImage rgb_img((const uchar*)rgb_frame.get_data(), w, h, QImage::Format_RGB888);
rgb_img = rgb_img.mirrored();

2. 绑定RGB图像到Qt3D材质

不能直接使用默认纯色的PhongMaterial,需要创建纹理对象并关联到材质的漫反射属性:

C++端处理

// 创建2D纹理及纹理图像
auto rgb_texture = new Qt3DRender::QTexture2D();
auto texture_img = new Qt3DRender::QTextureImage(rgb_texture);
texture_img->setImage(rgb_img);
rgb_texture->addTextureImage(texture_img);

// 将纹理绑定到PhongMaterial
auto phong_mat = ...; // 获取你定义的PhongMaterial实例(比如从QML中获取)
phong_mat->setDiffuse(Qt3DRender::QTextureMaterialParameter(rgb_texture));

QML端处理

若把C++中获取的QImage通过Q_PROPERTY暴露给QML,可直接在QML中创建纹理:

Qt3DRender.Texture2D {
    id: rsRgbTexture
    TextureImage {
        source: realSenseRgbImage // 对应C++暴露的QImage属性
    }
}

PhongMaterial {
    id: reconstructedMeshMaterial
    diffuse: rsRgbTexture
    ambient: "#F6C6AF" // 可根据需求保留或调整环境光
}

3. 实时更新纹理

RealSense是实时流,需要持续更新纹理数据。可通过RealSense的帧回调或QTimer定时刷新,注意要在主线程更新Qt3D资源:

void updateRgbTexture(rs2::video_frame new_frame) {
    QImage new_img((const uchar*)new_frame.get_data(), new_frame.get_width(), new_frame.get_height(), QImage::Format_RGB888);
    new_img = new_img.mirrored();
    // 若在子线程回调,需切换到主线程更新
    QMetaObject::invokeMethod(texture_img, [&]() {
        texture_img->setImage(new_img);
    }, Qt::QueuedConnection);
}

4. 检查Mesh的UV坐标

RGB纹理能正确映射的前提是Mesh带有正确的UV坐标。如果是RealSense重建的网格,SDK通常会自动生成UV;如果是自定义Mesh,需要手动为顶点添加UV属性,否则纹理会显示异常。

内容的提问来源于stack exchange,提问作者JKac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:24