本文主要是介绍提高拍照稳定性,减少由于抖动带来的影响(角速度计算),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基本思路
大家应该都听过苏格拉底给学生讲的捡麦穗的故事,本文借鉴了这个想法:把前面一半路作为观察期,记住最好的那根稻穗,在接下来的路程中,若遇到比前面最好那根还要好的,则毫不犹豫的直接选择它。
计算步骤:
分为两步:
1.获取角速度的数据;
2.计算最稳定的时刻。
1.加速度数据的获取
手机下载app:phyphox,里面有测角速度的,并支持csv的表格导出,自己处理一下便可得到数据。
三列分别代表:x、y、z三个方向的数值,可以取一个波动大的来进行分析,这里取了x轴的
由于习惯,我是喜欢把数据写入txt,这里进行一下转换:
#encoding=utf-8
import csv
import os
# f1=open('D:/共享文件/acc/a1/data.txt','w+')def write_col(path):with open(path,'r') as csvfile:reader = csv.reader(csvfile)column = [row[0] for row in reader]return columnpath='D:/work/1.工作任务/8.防抖函数/a2/gyro/'
files = os.listdir(path)
n=0
for file in files:if file.endswith('csv'):n=n+1cols=write_col(path+file)for i in range(0,len(cols)):col=cols[i]print(col)f=open(path+str(n)+'.txt','a')f.write(col+'\n')f.close()
2.寻找最稳定的一刻
from __future__ import print_function
import math
import random
import numpy as np
import glob
import osdef avg(list1):average = float(sum(list1))/len(list1)return average#同时处理多个文件
f1=open('D:/work/1.工作任务/8.防抖函数/a2/data.txt','w+')
path='D:/work/1.工作任务/8.防抖函数/a2/gyro/' #遍历的路径,找到txt文本
files = os.listdir(path)
for file in files:if file.endswith('txt'):print(file)n=0ff=open(path+file,'r') #打开txtsourceInLine=ff.readlines()dataset=[]set2=[]for line in sourceInLine:n=n+1temp1=line.strip('\n') #读行后去掉'\n'temp2=abs(float(temp1))dataset.append(temp2) #按原来顺序放进datasetset2.append(temp2) list_100=dataset[151:250] #剩下的路程dataset=dataset[1:150] #作为前面的一半路程dataset.sort() #数组按升序排序dataset_len=len(dataset)m=max(dataset)print("最大值为:",m)h=int(dataset_len/2)print("中位数为:",dataset[h])f=int(dataset_len/4)print("四分位数为:",dataset[f])yuzhi=int(dataset_len/3)yuzhi=dataset[yuzhi]print("阈值为:",yuzhi)#计算倒数8位的数据的均值、方差a=set2[n-8:n]last_20_avg=avg(a)print("最后20位均值为:",last_20_avg)#从某刻起,开始计算与阈值的差list_100_dif=[]for i in range(99):dif=list_100[i]-yuzhilist_100_dif.append(dif)#上面得到的100个差值,每n个作为一组,若一组中最大值<0,则视为通过,计算均值,放到新列表n=0x=3 #选定连续多少个点,作为稳定点y=8 #计算稳定点后面y个点的均值front=[]f8=[]#计算前50个点的稳定点最小均值for i in range(0,47):list_f=list_100_dif[i:i+x]avg_f=avg(list_f)front.append(avg_f)list_f.sort()if list_f[x-1]<0:if list_100[i]<list_100[i-1]:list_f8=list_100[i+x:i+x+y] #从i+x开始,往后推y个点avg_f8=avg(list_f8)f8.append(avg_f8)else:f8.append(avg_f)else:f8.append(avg_f)# min_f3=min(front)min_f8=min(f8)#在后50个点找稳定点for i in range(50,97):list_b=list_100_dif[i:i+x] #1-,21-40,41-60,61-80,81-100avg_b=avg(list_b)list_b.sort() #升序,如果数列中最后一个数<0,则代表数列所以都<0,即连续20个点都小于阈值if list_b[x-1]<0:if list_100[i]<list_100[i-1]:if avg_b<min_f8:list_b8=list_100[i+x:i+x+y] #从i+x开始,往后推y个点avg_b8=avg(list_b8)n=n+1print("最优稳定点均值为:",avg_b8)compare = avg_b8 - last_20_avgprint("对比结果为:", compare)i=str(i)breakif n==0:print("没有找到稳定点,开拍吧!")avg_b8=last_20_avgcompare=0i=0line=file+","+str(m)+","+str(dataset[h])+","+str(dataset[f])+","+str(yuzhi)+","+str(last_20_avg)+","+str(avg_b8)+','+str(i)+","+str(compare)+"\n"f1.write(line)
这篇关于提高拍照稳定性,减少由于抖动带来的影响(角速度计算)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!