在做GPS数据处理的时候,由于GPS一秒一个点数量很多,而且画出图来抖动也会很严重,为了减少计算量加快画线速度,需要想办法在保留原图像特征的情况下减少点的数量
博主尝试了通过斜率,通过相邻点之间的距离等算法进行过滤,效果都不太理想,最终使用此算法得到了很好的效果,通过调整阈值就可以调整平滑等级,部分代码如下
float getDistance(QList<QPointF> points,int stack1,int stack2,int point)
{
float d=0;
if(points[stack2].x()==points[stack1].x()) d = abs(points[point].x()-points[stack1].x());
else{
float k =(points[stack2].y()-points[stack1].y())/(points[stack2].x()-points[stack1].x());
d = abs(points[point].y()-k*points[point].x()+k*points[stack1].x()-points[stack1].y())/sqrt(1+k*k);
}
// printf("d: %f\n",d);
return d;
}
QPointF findMaxDistanceIndex(QList<QPointF> points,int stack1,int stack2)
{
QPointF max;
max.setX(0);
max.setY(stack1);
float dis = 0;
for(int i=stack1+1;i<stack2;i++)
{
dis = getDistance(points,stack1,stack2,i);
if(dis>max.x()) {max.setX(dis);max.setY(i);}
}
return max;
}
QPainterPath path;
int sm_level = this->sm_level=3;
int jumppoint=1;
int i=0,maxindex;
vector<int> stack1,stack2;
int cont=0;
maxindex = points.length()-1;
stack1.push_back(0);
stack2.push_back(maxindex);
while(stack2.size()>0)
{
int a= stack1.back();
int b = stack2.back();
QPointF maxdistance = findMaxDistanceIndex(points,stack1.back(),stack2.back());
printf("%f.%f\n",maxdistance.x(),maxdistance.y());
if(maxdistance.x()>sm_level)
stack2.push_back(maxdistance.y());
else{
stack1.push_back(stack2.back());
stack2.pop_back();}
}
path.moveTo(points[0].x(),points[0].y());
while(stack1.size()>0)
{
path.lineTo(points[stack1[0]].x(),points[stack1[0]].y());
vector<int>::iterator k = stack1.begin();
stack1.erase(k);
}
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(Qt::black, 2));
// 绘制曲线
painter.drawPath(path);
painter.end();
效果
原图
滤波后
阈值更高