背景:要判斷跟蹤算法在控制目標物走直線的情況下跟蹤的軌跡是否為直線,我保存下來跟蹤算法跟蹤到的目標的中心點在圖像上的像素位置,然后擬合出穿過這些點的直線,然后計算這些點距離直線的平均距離來判斷跟蹤的精度。(這個是不是要考慮,雖然我們控制讓目標物走直線,但是這種控制精度高嗎,或者說,他自己走著走著,軌跡會發生偏移,這需要有一個參照物,比如讓掃地機沿著地板磚縫隙走)
主要是使用python讀取csv數據
def readfile(filename):with open(filename, 'r') as f: reader = csv.reader(f.readlines()[1:])for line in reader:try:x = eval(line[1])y = eval(line[2])x_list.append(x)y_list.append(y)except:pass
x_list = []
y_list = []def func(a, b, x):return a*x + b
def linefitting():xs = np.array(x_list)ys = np.array(y_list)para = np.polyfit(xs, ys, deg = 1)print("擬合的直線方程 y=",np.poly1d(para) )y_fitted = func(para[0],para[1], xs)plt.figureplt.plot(xs, ys, 'ro', label='Original curve')plt.plot(xs, y_fitted, '-b', label = 'Fitted curve')plt.savefig('./trajectory.png')plt.legend()plt.show()return para
def calprecision(para):
# 計算所有的點到直線的距離
# y = a*x + b
# a*x - y + b = 0
# (a/b)*x - (1/b)*y + 1 = 0
# 方案一
# a = para[0]/para[1]
# b = -1/para[1]
# c = 1
# 方案二a = para[0]b = -1c = para[1]print("a:", a)print("b:", b)print("c:", c)
# ax+by+c = 0sum = 0down_num = cmath.sqrt(a**2 + b**2)
# print("down_num:", down_num)for i in range(len(x_list)):x = x_list[i]y = y_list[i]dis = abs(a*x + b*y + c)/down_numsum += disprint("總距離",sum)average = sum/len(x_list)print("平均像素距離:",average)
?