如何在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
相关产品推荐
相关产品推荐

