我们继续上回的做。完整工程的源码已经全部给大家分享到网盘了,名字叫做 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;
}
关于整个工程,我修改的太多了,具体程序还是大家自己下载感受吧