首页 > 其他分享 >离散点 plane to fit (最小二乘)

离散点 plane to fit (最小二乘)

时间:2023-09-27 15:35:38浏览次数:33  
标签:std pt Eigen fit temp float plane 二乘 cloud

 

 

using namespace Eigen;
int readStreamFile(
    const std::string &stream_file,
    std::vector<std::vector<Eigen::Vector3f>> &cloud_p)
{
    std::ifstream inFile(stream_file, std::ios::in | std::ios::binary);
    if (!inFile)
    {
        std::cout << "readstreamfile filed ..." << std::endl;
        return -1;
    }

    uint64_t time_m;
    int head = 0;
    int source_num_temp;
    int obs_num_temp;
    while (1)
    {
        if (head == 0)
        {
            if (!inFile.read((char *)&time_m, sizeof(uint64_t)))
                break;

            head++;
            continue;
        }
        else if (head == 1)
        {
            if (!inFile.read((char *)&source_num_temp, sizeof(int)))
                break;
            head++;
            continue;
        }
        else if (head == 2)
        {
            if (!inFile.read((char *)&obs_num_temp, sizeof(int)))
                break;
            head++;
            continue;
        }
        else
        {
            std::vector<Eigen::Vector3f> cloud(source_num_temp);
            for (int i = 0; i < source_num_temp; i++)
            {
                float pt[3];
                if (!inFile.read((char *)pt, 3 * sizeof(float)))
                {
                    break;
                }

                cloud[i][0] = pt[0];
                cloud[i][1] = pt[1];
                cloud[i][2] = pt[2];
            }

            std::vector<Eigen::Vector3f> obs_cloud(obs_num_temp);
            for (int i = 0; i < obs_num_temp; i++)
            {
                float pt[3];
                if (!inFile.read((char *)pt, 3 * sizeof(float)))
                {
                    return -1;
                }

                obs_cloud[i][0] = pt[0];
                obs_cloud[i][1] = pt[1];
                obs_cloud[i][2] = pt[2];
            }

            cloud_p.push_back(cloud);
            head = 0;
            source_num_temp = 0;
            obs_num_temp = 0;

        }
    }

    inFile.close();
    return 0;
}


int fitPlane(const std::vector<Eigen::Vector3f> & in_points) {

    Eigen::Quaterniond q = 
        Eigen::AngleAxisd(0, Eigen::Vector3d::Unit(2)) *
        Eigen::AngleAxisd((-3.1515926/4.0), Eigen::Vector3d::Unit(1)) *
        Eigen::AngleAxisd(0, Eigen::Vector3d::Unit(0));

    int count = in_points.size();
    //解最小二乘解问题
    Eigen::MatrixXf A(count, 4);   //(行,列)
    for (int i = 0; i < count; i++)
    {
        Eigen::Vector3f temp = q.cast<float>() * in_points[i];
        A(i, 0) = static_cast<float>(temp.x());
        A(i, 1) = static_cast<float>(temp.y());
        A(i, 2) = static_cast<float>(temp.z());
        A(i, 3) = 1.0f;
    }

    Eigen::JacobiSVD<Eigen::MatrixXf> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
    Eigen::MatrixXf V = svd.matrixV(), U = svd.matrixU();
    //Eigen::Matrix3f S = U.inverse() * A * V.transpose().inverse(); // S = U^-1 * A * VT * -1
    //float A = V(0, 3);
    //float B = V(1, 3);
    //float C = V(2, 3);
    //float D = V(3, 3);
    std::cout << V << std::endl;
    Eigen::Vector3f normal(V(0, 3), V(1, 3), V(2, 3));
    return 0;
}

int main1515() {
    std::string stream_file = "./cloud_stream_11.stream";
    std::vector<std::vector<Eigen::Vector3f>> cloud_p;
    int ret = readStreamFile(stream_file, cloud_p);
    
    float box[6] = { -1.0,1.0,-1.0,1.0,-0.3, 0.3 };

    std::ofstream  file_xyz("./test.xyz");
    std::vector<Eigen::Vector3f> in_points;
    for (size_t i = 0; i < 10; i++)
    {
        for (size_t j = 0; j < cloud_p[i].size(); j++)
        {
            if (cloud_p[i][j].x() > box[0] &&
                cloud_p[i][j].x() < box[1] &&
                cloud_p[i][j].y() > box[2] &&
                cloud_p[i][j].y() < box[3] &&
                cloud_p[i][j].z() > box[4] &&
                cloud_p[i][j].z() < box[5]) {

                file_xyz << cloud_p[i][j].x() << " " << cloud_p[i][j].y() << " " << cloud_p[i][j].z() << "\n";
                in_points.emplace_back(cloud_p[i][j]);
            }
        }
    }
    file_xyz.close();
    fitPlane(in_points);

    return 0;
}

 

标签:std,pt,Eigen,fit,temp,float,plane,二乘,cloud
From: https://www.cnblogs.com/lovebay/p/17732827.html

相关文章

  • SigFit—光-机-热耦合分析工具
        美国Sigmadyne公司的SigFit软件是光机热耦合分析工具,可以将有限元分析得到的光学表面变形等结果文件通过多项式拟合或插值转化为光学分析软件的输入文件,还可实现动态响应分析、光程差分析、设计优化、主动控制/自适应控制光学系统的促动器布局及优化等。SigFit帮助用户......
  • R语言用普通最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类|附代码数
    原文链接:http://tecdat.cn/?p=21379 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于回归的研究报告,包括一些图形和统计输出。本文我们对逻辑回归和样条曲线进行介绍。logistic回归基于以下假设:给定协变量x,Y具有伯努利分布,  目的是估计参数β。回想一下,针对该......
  • 最小二乘法求解线性回归模型
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 【lssvm回归预测】基于变模态结合秃鹰算法优化最小二乘支持向量机VMD-BES-LSSVM实现数
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • fit 缩放形式
    fit 缩放形式fit 缩放形式对应的是BoxFit是一个枚举contain是默认的形式,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。fill拉伸填充,宽高比例会发生变化,导致图片变形cover 会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示......
  • CF838D Airplane Arrangements 题解
    题意一架飞机有\(n\)个座位排成一列,有\(m\)名乘客(\(m\leqn\))依次上飞机。乘客会选择一个目标座位(两人可以选同一个目标座位),然后选择从前门或者后门上飞机,上飞机后,他们会走到自己的目标座位,如果目标座位已经有人坐了,他们会继续往前走,在走到第一个空位后坐下。如果走到最后......
  • How Can Recommender Systems Benefit from Large Language Models: A Survey 阅读笔
    论文主要从LLM应用在推荐系统哪些部分以及LLM如何应用在推荐系统中,还讨论了目前LLM应用在RS中的一些问题。Where?推荐系统哪些部分哪里可以应用到大模型?文章中提到了特征工程、特征编码、评分/排序函数、推荐流程控制。LLMforFeatureEngineering用大模型做特征工程:利用......
  • 网络请求-Android篇(Okhttp和Retrofit)
    一.OkHttp的介绍和基本用法OkHttp是一个流行的开源Java和Android应用程序的HTTP客户端。它由SquareInc.开发,提供了一种简单高效的方式来进行应用程序中的HTTP请求。要在Java或Android项目中使用OkHttp,您需要将OkHttp依赖项添加到您的build.gradle文件中。然后,您可以创建一个......
  • 论文解读(IW-Fit)《Better Fine-Tuning via Instance Weighting for Text Classificatio
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:BetterFine-TuningviaInstanceWeightingforTextClassification论文作者:论文来源:2021ACL论文地址:download 论文代码:download视屏讲解:click1介绍出发点:域适应一类方法是对预先训练好的模型参数进行微......
  • Gym103687D The Profiteer:回滚莫队信息双指针可以做到线性对数
    标题写得好所谓的回滚莫队信息意思是,设信息保存在两个大小分别为\(a,b\)的结构上,将这两个信息进行合并得到大小为\(a+b\)的信息需要的时间为\(\Omega(\min\{a,b\}\cdotf(n))\);而给定一个大小为\(1\)的信息,可以在\(\mathrmO(f(n))\)时间内将它加入到任何一个结构中......