两个场景的车辆相似度评估并画图(弗雷歇距离)

该代码实现了一套计算曲线相似度的方法,包括归一化处理、Frechet距离和DTW距离。通过读取Excel文件获取数据,对数据进行移动和归一化操作,然后比较不同场景和车辆轨迹的相似性。最后,通过图形展示相似性结果。
摘要由CSDN通过智能技术生成

疑问:是否有必要normalize?(待解决)

import math

import numpy as np
import pandas as pd
import torch
from matplotlib import pyplot as plt
from shapesimilarity import shape_similarity, procrustes_normalize_curve, find_procrustes_rotation_angle, rotate_curve, \
    frechet_distance, curve_length, euclidean_distance
from torch import sigmoid


def curve_length_mine(curve):
    '''
    Args:
      points: type arrays two values [[x, y], [x, y]]
    Returns:
      acc_length: curve length
    Descriptions:
      Calculate the length of the curve
    '''

    acc_length = 0
    for i in range(0, len(curve) - 1):
        acc_length += euclidean_distance(curve[i], curve[i + 1])
    return acc_length


def normalize(arr, t_min, t_max):
    norm_arr = []
    diff = t_max - t_min
    diff_arr = max(arr) - min(arr)
    for i in arr:
        temp = (((i - min(arr)) * diff) / diff_arr) + t_min
        norm_arr.append(temp)
    return norm_arr


def Frechet(CarA, CarB):
    return shape_similarity(CarA, CarB)


def DTWDistance(s1, s2):
    DTW = {}

    for i in range(len(s1)):
        DTW[(i, -1)] = float('inf')
    for i in range(len(s2)):
        DTW[(-1, i)] = float('inf')
    DTW[(-1, -1)] = 0

    for i in range(len(s1)):
        for j in range(len(s2)):
            dist = (s1[i] - s2[j]) ** 2
            DTW[(i, j)] = dist + min(DTW[(i - 1, j)], DTW[(i, j - 1)], DTW[(i - 1, j - 1)])

    return np.sqrt(DTW[len(s1) - 1, len(s2) - 1])


def get_data(path):
    df = pd.read_excel(path, header=None)
    df = df.iloc[:, [i % step == 0 for i in range(len(df.columns))]]
    data = df.values
    data = data.reshape(2, -1)
    range_to_normalize = (minn, maxx)

    # data[0] = normalize(data[0], range_to_normalize[0], range_to_normalize[1])
    # data[1] = normalize(data[1], range_to_normalize[0], range_to_normalize[1])

    return data.T


def getpath(scen, tra):
    return "../track/Scen" + str(scen) + "Tra" + str(tra) + ".xlsx"


def move(data, data2):
    dx = data2[0][0] - data[0][0]
    dy = data2[0][1] - data[0][1]
    # print(data.shape)
    # print(data.shape)
    for i in range(0, int(data.shape[1])):
        data[i][0] += dx
        data[i][1] += dy

    return data, data2


def print_similarity_graph():
    for i in range(1, 3):
        for j in range(1, 4):
            for k in range(1, 4):
                if j >= k:
                    continue
                path1 = getpath(i, j)
                path2 = getpath(i, k)

                data = get_data(path1)
                print(data)
                data2 = get_data(path2)
                plt.plot(data[:, 0], data[:, 1], 'D:', color="red", linewidth=2.0)
                plt.plot(data2[:, 0], data2[:, 1], 'D:', color="blue", linewidth=2.0)
                # data,data2=move(data,data2)

                similarity = Frechet(data, data2)
                plt.title(f'scen{i} Car{j} and Car{k}\'s similarity is: {similarity}', fontsize=14, fontweight='bold')
                # plt.title(f'Shape similarity is: {similarity}', fontsize=14, fontweight='bold')
                plt.show()


step = 50
minn = 0
maxx = 3
print_similarity_graph()


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值