三维场景动态生成正射纹理-框选区域拍照出图

本文介绍了一种通过添加SlaveCamera来实现框选区域拍照的技术。首先初始化SlaveCamera并设置其属性,然后在用户交互结束后调整相机姿态以匹配绘制的多边形。最后,设置相机回调以保存拍照后的纹理。这种方法涉及到osgEarth库、OpenGL渲染以及深度测试等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       本文通过上节的人机交互形式获取模型拍照区域,采用添加Slave相机的形式实现框选区域拍照出图。

目录

  • 添加Slave相机,框选区域拍照出图

内容

       在上期的RegionSelect中,将SlaveCamera初始化并添加到视图(viewer)中,在交互动作的最后,根据绘制的多边形调整SalveCamera的姿态,最后添加相机回调用于保存拍照后的纹理。

  • 1 SalveCamera 初始化
    RegionSelect(osgViewer::Viewer* viewer, osgEarth::MapNode* mapNode)
    {
        ....
        ....
        ....

        _slaveCamera = new osg::Camera;
        {
            _slaveCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
            _slaveCamera->setClearColor(osg::Vec4d(0, 0, 0, 0));
            _slaveCamera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
            _slaveCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
            _slaveCamera->setRenderOrder(osg::Camera::PRE_RENDER);
            _slaveCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
            //_imageGeneratorCamera->setImplicitBufferAttachmentMask(0, 0);
            _slaveCamera->dirtyAttachmentMap();
            _slaveCamera->attach(osg::Camera::COLOR_BUFFER0, _image.get());
            _slaveCamera->setSmallFeatureCullingPixelSize(-1.0f);
            _slaveCamera->setCullMask(~0u);
            double distance = 10;

            // set up a StateSet for the RTT camera.
            osg::StateSet* rttStateSet = _slaveCamera->getOrCreateStateSet();

            //rttStateSet->setAttributeAndModes(new osg::CullFace(osg::CullFace::BACK), osg::StateAttribute::ON | osg::StateAttribute::PROTECTED);
            osg::StateAttribute::OverrideValue forceOff =
                osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED | osg::StateAttribute::OVERRIDE;
            rttStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON | osg::StateAttribute::PROTECTED | osg::StateAttribute::OVERRIDE);
            rttStateSet->setRenderBinDetails(1003, "DepthSortedBin", osg::StateSet::OVERRIDE_RENDERBIN_DETAILS);

            //rttStateSet->setAttribute(new osg::Depth(osg::Depth::LEQUAL), osg::StateAttribute::ON | osg::StateAttribute::PROTECTED | osg::StateAttribute::OVERRIDE);
            //rttStateSet->setRenderBinDetails(10, "DepthSortedBin", osg::StateSet::OVERRIDE_RENDERBIN_DETAILS);
            //rttStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);//关闭深度测试
            rttStateSet->setDefine(OE_LIGHTING_DEFINE, forceOff);
            //rttStateSet->addUniform( Registry::shaderFactory()->createUniformForGLMode(GL_LIGHTING, forceOff) );
            rttStateSet->setMode(GL_LIGHTING, forceOff);
        }
        _slaveCamera->setViewport(0, 0, _width, _height);
        viewer->addSlave(_slaveCamera);
    }
  • 2  修改SlaveCamera姿态

      为了方便多边形框选工具的管理,可添加一个监视器实现多边形框选工具的装载与卸载。具体代码如下:

virtual void endhandle()
    {
        if (_feature->getGeometry()->size() < 3)
        {
            _feature->getGeometry()->clear();
            _worldPts.clear();
            _featureNode->dirty();
            return;
        }
        osg::ref_ptr<osg::Image> image;
        osg::Matrix world2TexMatrix;
        //orthoImageGenerator->RenderToImage(_worldPts, 0.1, image, world2TexMatrix);
        //osgDB::writeImageFile(*image, "C:/Users/CaiPing/Desktop/实体生成/test.jpg");
        {
            std::vector<osg::Vec3d> points;
            osg::ref_ptr<osgEarth::Polygon> polygon = (osgEarth::Polygon*)_feature->getGeometry();
            osg::Vec3d centerPoint;
            for (int i = 0; i < polygon->size(); i++)
            {
                points.push_back(polygon->at(i));
                centerPoint += (polygon->at(i) / polygon->size());
            }
            osg::Plane localPlane;
            PlaneFit(points, localPlane);
            double distance = 10;
            osg::Vec3d localNormal = osg::Vec3d(localPlane.asVec4()[0], localPlane.asVec4()[1], localPlane.asVec4()[2]);
            osg::Matrix toLocalPlaneMatrix = osg::Matrixd::translate(-points[0]) * osg::Matrix::rotate(localNormal, osg::Vec3d(0, 0, 1));
            osg::Vec3d localNorth = osg::Vec3d(0, 1, 0) * osg::Matrix::rotate(osg::Vec3d(0, 0, 1), localNormal);
            _slaveCamera->setViewMatrixAsLookAt(centerPoint + localNormal * distance, centerPoint, localNorth);

            osg::BoundingBox localBox;
            for (int i = 0; i < points.size(); i++)
            {
                osg::Vec3d tempPoint = points[i] * toLocalPlaneMatrix;
                localBox.expandBy(tempPoint);
            }
            _slaveCamera->setProjectionMatrixAsOrtho(localBox.xMin(), localBox.xMax(), localBox.yMin(), localBox.yMax(), 1, 200); //投影矩阵视图范围
            //_imageGeneratorCamera->setProjectionMatrixAsPerspective(45, 1.0*outImageWidth/ outImageHeight, 0, 500);
            _world2TexMatrix = _slaveCamera->getViewMatrix() * _slaveCamera->getProjectionMatrix();
            _slaveCamera->setPreDrawCallback(new Callback(this));

        }
  • 3 相机回调保存纹理
 class Callback : public osg::Camera::DrawCallback
    {
    public:
        Callback(RegionSelect* regionSelect)
        {
            _regionSelect = regionSelect;
        }
        virtual void operator () (osg::RenderInfo& renderInfo) const
        {
            _regionSelect->writeOut();
        }
    protected:
        RegionSelect* _regionSelect;
};
### 手机照片实景三维建模软件推荐 目前市面上存在多种支持通过手机拍摄的照片进行实景三维建模的软件,这些工具大多利用先进的计算机视觉算法和云计算能力来实现高效的三维重建。以下是几款适合移动端使用的实景三维建模软件: #### 1. **RealityCapture** RealityCapture 是一款功能强大的三维建模软件,其核心特点在于能够从像或激光扫描中创建高精度的实景三维模型正射影像[^1]。尽管该软件主要面向桌面端用户设计,但它也兼容移动设备上传的照片文件,因此可以通过手机拍摄片并导入到 RealityCapture 中完成建模。 #### 2. **大疆智 (DJI Terra)** 大疆智不仅适用于无人机采集的数据处理,还支持基于地面摄影测量的方式生成高质量的二维正射影像三维模型[^2]。如果用户的智能手机具备较高的摄像头分辨率,则可以直接使用手机拍摄的照片作为输入源,在大疆智平台上构建精细的三维场景。 #### 3. **Pix4D Capture & Pix4Dmodel** Pix4D 提供了一整套从数据获取到后期处理的服务体系,其中 Pix4D Capture 应用程序专为 iOS 和 Android 平台开发,允许用户轻松规划飞行路径或者手动拍照;随后借助 Pix4Dmodel 可快速换成逼真的三维成果物。整个流程简单直观,非常适合初学者尝试操作。 #### 4. **Meshroom by AliceVision** AliceVision 的开源项目 Meshroom 提供了一个易于使用的界面来进行 SfM(Structure from Motion)计算以及纹理映射等工作流阶段。虽然它本身是一个跨平台应用程序而非专门针对移动终端优化的产品,但由于支持命令行模式运行以及 API 接口调用等功能特性,开发者完全可以将其集成至自定义解决方案当中去适配各类硬件环境下的需求[^3]。 #### 5. **Colmap** 对于那些希望深入研究背后原理并对现有框架做改进的技术爱好者来说,Google 开发维护的 Colmap 或许会成为不错的选择之一。这款免费开源库专注于解决大规模多视角立体匹配难题,并且已经证明能够在合理时间内产令人满意的恢复效果。即使是在资源受限条件下也能表现色——这意味着即便只依赖于普通消费级数码产品所记录下来的素材集也同样有机会获得较为理想的输质量。 此外值得注意的是,为了提高整体工作效率还可以考虑引入专业的存储管理方案如曙光实景三维数据存储解决方案等辅助措施来保障各个环节顺畅衔接的同时最大化发挥软硬件潜力[^4]^。 最后不得不提的一点就是经济因素考量方面的影响作用不可忽略不计。相比于传统手工绘制方法而言采用自动化手段确实可以在一定程度上削减开支成本但具体节约幅度还需视实际情况而定[^5]^. ```python import os from PIL import Image def load_images_from_directory(directory_path): images = [] supported_extensions = ['.jpg', '.jpeg', '.png'] for filename in os.listdir(directory_path): ext = os.path.splitext(filename)[1].lower() if ext in supported_extensions: img_path = os.path.join(directory_path, filename) with Image.open(img_path) as img: images.append(img) return images ``` 上述代码片段展示了如何加载指定目录中的所有支持扩展名的像文件列表以便后续传递给选定的三维建模工具进行进一步分析加工过程演示示例而已并非实际生产环境中推荐做法因为缺乏错误检测机制等问题尚未妥善解决前不宜贸然投入使用场合之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CHPCWWHSU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值