提高拍照稳定性,减少由于抖动带来的影响(角速度计算)

基本思路

大家应该都听过苏格拉底给学生讲的捡麦穗的故事,本文借鉴了这个想法:把前面一半路作为观察期,记住最好的那根稻穗,在接下来的路程中,若遇到比前面最好那根还要好的,则毫不犹豫的直接选择它。

计算步骤:

分为两步:
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 column

path='D:/work/1.工作任务/8.防抖函数/a2/gyro/'
files = os.listdir(path)
n=0
for file in files:
	if file.endswith('csv'):
		n=n+1
		cols=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 os

def 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=0
		ff=open(path+file,'r')   #打开txt
		sourceInLine=ff.readlines()
		dataset=[]
		set2=[]
		for line in sourceInLine:
			n=n+1
			temp1=line.strip('\n')   #读行后去掉'\n'
			temp2=abs(float(temp1))
			dataset.append(temp2)    #按原来顺序放进dataset
			set2.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]-yuzhi
			list_100_dif.append(dif)
		
		#上面得到的100个差值,每n个作为一组,若一组中最大值<0,则视为通过,计算均值,放到新列表
		n=0
		x=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-100
			avg_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+1
						print("最优稳定点均值为:",avg_b8)
						compare = avg_b8 - last_20_avg
						print("对比结果为:", compare)
						i=str(i)
						break
		if n==0:
			print("没有找到稳定点,开拍吧!")
			avg_b8=last_20_avg
			compare=0
			i=0
		line=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)				
	

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值