【C++QT】实现Douglas-Peucker,矢量压缩算法

在做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();

效果
原图
请添加图片描述
滤波后
请添加图片描述
阈值更高
请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值