三维扫描设备-毕业设计(创新点记录)
本文最后更新于298 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

1.添加路径规划功能

将三维测量点投影到一个平面上,推测一个剂量值,然后平面路径规划 之后再把路径显示到三维中

1. 投影方式

  • 直接投影到基平面(如 XY 平面)
    • 忽略 Z 坐标,将所有三维点投影到 XY 平面上。
    • 这是最简单的方式,适用于高度变化不大或高度信息不重要的场景。
  • 投影到特定高度平面
    • 选择一个特定的高度(如地面高度),将所有三维点投影到该平面上。
    • 适用于需要关注特定高度(如地面)的场景。

2. 数据聚合方法

在将三维数据投影到二维平面后,需要对每个二维网格内的数据进行聚合。以下是几种常见的聚合方法:

(1) 取最大值

  • 方法:在每个二维网格内,取所有投影点中的最大剂量值。
  • 适用场景
    • 当需要规避高剂量区域时,取最大值可以确保路径规划避开最危险的区域。
    • 适用于对高剂量区域敏感的应用(如辐射防护)。

#include <iostream>
#include <QApplication>
#include <QMainWindow>
#include <QFileDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QSlider>
#include <QLabel>

// Point Cloud Library
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

// VTK
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <QVTKWidget.h>	

typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent), ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        // 初始化点云
        cloud.reset(new PointCloudT);

        // 设置窗口标题
        this->setWindowTitle("3D Point Cloud Viewer with Path Planning");

        // 创建用于显示点云的窗口部件
        vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
        renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
        renderWindow->AddRenderer(renderer);
        viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", false));

        // 创建 QVTKWidget 并设置到主窗口
        vtkWidget = new QVTKWidget(this);
        vtkWidget->SetRenderWindow(viewer->getRenderWindow());
        viewer->setupInteractor(vtkWidget->GetInteractor(), vtkWidget->GetRenderWindow());

        // 设置布局
        QWidget *centralWidget = new QWidget(this);
        QVBoxLayout *layout = new QVBoxLayout(centralWidget);
        layout->addWidget(vtkWidget);
        this->setCentralWidget(centralWidget);

        // 加载点云按钮
        loadButton = new QPushButton("Load Point Cloud", this);
        layout->addWidget(loadButton);

        // 目标点按钮
        targetButton = new QPushButton("Set Target Point", this);
        layout->addWidget(targetButton);

        // 连接按钮信号与槽
        connect(loadButton, &QPushButton::clicked, this, &MainWindow::loadPointCloud);
        connect(targetButton, &QPushButton::clicked, this, &MainWindow::setTargetPoint);

        // 初始化路径规划器
        planner = nullptr;
    }

    ~MainWindow()
    {
        delete ui;
    }

public Q_SLOTS:
    void loadPointCloud()
    {
        QString fileName = QFileDialog::getOpenFileName(this, "Open PCD File", "", "PCD Files (*.pcd)");
        if (!fileName.isEmpty()) {
            if (pcl::io::loadPCDFile<pcl::PointXYZRGBA>(fileName.toStdString(), *cloud) == -1) {
                PCL_ERROR("Couldn't read file %s \n", fileName.toStdString().c_str());
                return;
            }
            // 显示点云
            viewer->addPointCloud<pcl::PointXYZRGBA>(cloud, "cloud");
            viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
            viewer->resetCamera();
            viewer->spinOnce();
        }
    }

    void setTargetPoint()
    {
        // 这里你可以实现选择目标点的逻辑,例如通过鼠标点击选择点云中的一个点
        // 然后调用路径规划器来规划路径
        std::cout << "Setting target point..." << std::endl;

        // 示例:假设选择点云的最后一个点作为目标点
        if (!cloud->points.empty()) {
            int index = cloud->points.size() - 1;
            pcl::PointXYZRGBA targetPoint = cloud->points[index];

            // 创建路径规划器并规划路径到目标点
            if (planner == nullptr) {
                planner = new PathPlanner(cloud); // 假设你的路径规划器类有一个构造函数接受点云
            }
            std::vector<pcl::PointXYZ> path = planner->planPath(cloud->points[0], targetPoint);

            // 显示路径(示例:将路径点保存到一个文件)
            if (!path.empty()) {
                std::cout << "Path planned with " << path.size() << " points." << std::endl;
                // 在这里你可以添加代码来可视化路径或保存路径到文件
            }
        }
    }

private:
    Ui::MainWindow *ui;
    QVTKWidget *vtkWidget;
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow;
    pcl::visualization::PCLVisualizer::Ptr viewer;
    PointCloudT::Ptr cloud;
    QPushButton *loadButton;
    QPushButton *targetButton;
    PathPlanner *planner; // 假设你的路径规划器类名为 PathPlanner
};

// PathPlanner 类的简单实现示例(需要根据你的具体需求调整)
class PathPlanner {
public:
    PathPlanner(PointCloudT::Ptr cloud) : cloud(cloud) {}
    std::vector<pcl::PointXYZ> planPath(const pcl::PointXYZ &start, const pcl::PointXYZ &goal) {
        // 这里是路径规划的逻辑
        // 在实际应用中,你需要根据你的具体算法(如 A*)来实现
        std::vector<pcl::PointXYZ> path;
        // 示例:添加起点和目标点到路径
        path.push_back(start);
        path.push_back(goal);
        return path;
    }
private:
    PointCloudT::Ptr cloud;
};

2.扫描实时获取图-网格化(优化性能)

具体实现 体素滤波降采样后减少点云个数 然后再将剩下的点云放大即可

3.剂量算法优化(低剂量区域采用能谱探测器G(E)函数转换)

4.反投影算法优化(看是否能添加方向因子)

吴某某 三维扫描设备-毕业设计(创新点记录) https://web.mcfrys.cn/index.php/2025/06/19/%e4%b8%89%e7%bb%b4%e6%89%ab%e6%8f%8f%e8%ae%be%e5%a4%87-%e6%af%95%e4%b8%9a%e8%ae%be%e8%ae%a1%e5%88%9b%e6%96%b0%e7%82%b9%e8%ae%b0%e5%bd%95/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇