使用QT搭建点云显示框架系列四·QTextStream 读取任意格式的点云

11 篇文章 1 订阅
6 篇文章 3 订阅

我们继续上回的做。完整工程的源码已经全部给大家分享到网盘了,名字叫做 NinjaScarlet_GLViewerFramework

那么关于源码的分享,大家可以看我置顶的一篇文章,或者直接找我要:QQ 498771026

我们最终是想要完成一个可交互的点云、影像处理的软件。

这一次完善了点云读取类,将之前的基于文件映射的读取类改成了基于QTextStream,因为要加入进度条,还必须重载QThread,那么文件映射就不能用啦!而且QTextStream的速度也是非常快的,我在之前的文章里面也进行过对比。

针对每种类型的点云读取你都要设置不同的进度条方式。这样做了之后,你就可以一次性读取多个点云了。当看到效果的时候连我自己也震惊了!来,我们先上一下效果



我稍微修改了一下结构,将xyz,rgb,nxnynz三种属性分开,这样我可以自适应地判断读取进来的一行究竟有多少列,避免了不必要的内存开辟。

然后新加入了选点功能,按住Shift单击鼠标左键可以选点了,控制台下面也可以看到选点结果。

接下来准备加入一个可交互的图像处理功能。

那么我就简单放一下读取ply格式的一个QTextStream代码在下面

int Q_ScarletThreadReader::RunThreadFrom_PLY()
{
    QString FilePath = m_FullPath;
    QFileInfo info(FilePath);
    if(!info .isFile())
        return 0;

    //other useful variables
    unsigned linesRead = 0;
    unsigned pointsRead = 0;
    QFile file(FilePath);
    if (!file.open(QFile::ReadOnly))
        return -1; //we clear already initialized data
    QTextStream stream(&file);
    QString currentLine;
    m_FieldFormat.clear();
    //Analysis the file header
    do
    {
        currentLine = stream.readLine();
        linesRead++;
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        QString firstStr =sections[0].trimmed();
        if(firstStr == QString("ply"))
        {

        }
        else if(firstStr == QString("format"))
        {

        }
        else if(firstStr == QString("element"))
        {
            QString PtNumStr = sections[sections.size()-1];
            m_PtNum =PtNumStr.toDouble();
            qDebug()<<"NumGetFromHead:"<<m_PtNum;
            emit(signal_SetProgressBarMaxVal(m_PtNum));
            m_Rows = m_PtNum;
            m_Cols = 1;
            if(m_PtNum ==0.0)
                return -2;
        }
        else if(firstStr == QString("property") )
        {
            QPair<QString,QString>  FormatPair;
            FormatPair.second = sections[sections.size()-1];
            FormatPair.first =sections[sections.size()-2];
            m_FieldFormat.push_back(FormatPair);
            m_FieldCount =m_FieldFormat.size();//每次都添加也没有问题

        }
        else
        {

        }

    }while (!currentLine.isNull()&&
            currentLine!=QString("end_header"));
    //Analysis the point block
    QList<QPair<QString,QString>> format =m_FieldFormat;
    if(HasTheFormat(format,QString("x"))&&
       HasTheFormat(format,QString("y"))&&
       HasTheFormat(format,QString("x")))
    {
        m_PtCloud = new QPt[m_PtNum];
        m_has_xyz  =true;
    }
    if(HasTheFormat(format,QString("nx"))&&
       HasTheFormat(format,QString("ny"))&&
       HasTheFormat(format,QString("nz")))
    {
        m_PtCloudNorm = new QPtNorm[m_PtNum];
        m_has_rgb = true;
    }
    if((HasTheFormat(format,QString("red"))||HasTheFormat(format,QString("diffuse_red")))&&
       (HasTheFormat(format,QString("green"))||HasTheFormat(format,QString("diffuse_green")))&&
       (HasTheFormat(format,QString("blue"))||HasTheFormat(format,QString("diffuse_blue"))))
    {
         m_PtCloudColor = new QPtColor[m_PtNum];//the color
         m_has_Norm = true;
    }
    int CurrentCloudIndex =0;
    do
    {
        currentLine =stream.readLine();
        if(
                currentLine.isNull()/*||
                m_PtCloud.size() == m_PtNum*/)
        {
            break;
        }
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        QPt SinglePt;
        QPtColor SinglePtColor;
        QPtNorm SinglePtNorm;
        if(sections.size()==m_FieldCount)
        {
            //now days wo only see
            //x y z nx ny nz red(diffuse) green(diffuse) blue(diffuse)
            for(int i=0;i<format.size();i++)
            {
                QString secStr = sections[i];
                if(format[i].second == QString("x"))
                {
                    SinglePt.x =secStr.toDouble();
                }
                else if(format[i].second  == QString("y"))
                {
                    SinglePt.y =secStr.toDouble();
                }
                else if(format[i].second == QString("z"))
                {
                    SinglePt.z =secStr.toDouble();
                }
                else if(format[i].second == QString("nx"))
                {
                    SinglePtNorm.Nx =secStr.toDouble();
                }
                else if(format[i].second == QString("ny"))
                {
                    SinglePtNorm.Ny =secStr.toDouble();
                }
                else if(format[i].second == QString("nz"))
                {
                    SinglePtNorm.Nz =secStr.toDouble();
                }
                else if(format[i].second == QString("red")||
                        format[i].second == QString("diffuse_red"))
                {
                    SinglePtColor.r =secStr.toDouble();
                }
                else if(format[i].second == QString("green")||
                        format[i].second == QString("diffuse_green"))
                {
                    SinglePtColor.g =secStr.toDouble();
                }
                else if(format[i].second == QString("blue")||
                        format[i].second == QString("diffuse_blue"))
                {
                    SinglePtColor.b =secStr.toDouble();
                }
            }
            if(m_has_xyz)
                m_PtCloud[CurrentCloudIndex] =SinglePt;//the cloud
            if(m_has_rgb)
                m_PtCloudColor[CurrentCloudIndex] =SinglePtColor;//the color
            if(m_has_Norm)
                m_PtCloudNorm[CurrentCloudIndex] =SinglePtNorm;//the norm
            CurrentCloudIndex++;
            emit(signal_SetProgressBarVal(CurrentCloudIndex));
        }
        else
        {
            //wrong format we loaded it as I guess!
            //nothing to do!
        }
        linesRead++;
        pointsRead++;

    }while(1);
    file.close();
    qDebug()<<"linesRead:"<<linesRead;
    qDebug()<<"pointsRead:"<<pointsRead;
    //QMutexLocker locker(&m_mutex);
    return linesRead;
}
关于整个工程,我修改的太多了,具体程序还是大家自己下载感受吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值