高中阶段常见的测定重力加速度方法包括自由落体法斜面滚球法单摆法弹簧振子法等。自由落体法需要使用打点计时器或光电门测量下落时间与位移;单摆法需要使用单摆、秒表类计时装置;斜面滚球法需要营造光滑斜面环境;弹簧振子法利用垂直弹簧振子的周期公式,结合胡克定律才能完成重力加速度测定,理论要求较高,实际动手实验要求更高。从实用角度出发,在信息科技实验室开展上述实验,涉及设备越少、取材越容易,就更具可操作性。为了达到这一目标,笔者对自由落体法测定重力加速度方法进行了改进,采用计算机视觉处理分析自由落体运动状态,可较好地解决常见的测定重力加速度方法存在的问题,并能适当拓展,实现对诸如平抛运动、圆周运动进行类似分析。
基于计算机视觉测定重力加速度实验原理
使用摄像头录制自由落体运动视频,逐帧提取目标物体的位置坐标,借助软皮尺在图像中的尺寸,得到像素距离与实际长度的比例关系(标定),将像素位移转换为实际位移,再通过录制视频的帧率计算得到相邻2张图片的时间间隔,根据得到的位置与时间数据,借助科学计算库模块SciPy,通过非线性最小二乘法将自定义函数拟合到给定的数据点,从而计算得出重力加速度的具体值。
实验步骤
实验硬环境准备
带有摄像功能的智能手机、平板类设备,建议拍摄分辨率≥1 080p,帧率≥60 fps,有助于提高实验结果精度。
拍摄背景与落体对比强烈,如拍摄背景颜色为白色、落体颜色为黑色,背景上垂直放置已知长度的软皮尺,用于像素与实际长度转换。
固定摄像头垂直于落体轨迹平面,确保背景简洁,且像素与实际长度转换比例在一个易于计算的值上。比如,一幅拍摄画面像素大小为1 920×1 080,软皮尺10 mm的长度对应拍摄画面400个像素点,实际长度与像素点数量的转换比例为0.000 25。
能顺畅运行Python3.x的电脑,能进行数据处理分析即可。
实验软环境准备
从培养学科核心素养角度出发,为了更好地培养学生的计算思维能力和数字化学习创新能力,可采用Python,以及诸如视觉处理模块OpenCV、科学计算模块SciPy与绘图模块Matplotlib等。
自由落体视频录制
在落体下落前先行录制,便于后期使用视觉处理模块OpenCV分析提取起始帧,并根据起始帧提取出相邻帧的时刻与对应的落体位置。
自由落体视频帧提取与观察
将拍摄的自由落体视频传输至电脑,使用视频播放软件观看,可看到落体下落过程转瞬即逝,不利于确定起始帧。通过OpenCV,可将视频帧截取并通过图片查看软件确定开始进行自由落体运动的起始帧。
自由落体视频有效片段截取
通过看图软件确定需要进行分析的起始帧与截止帧序号,再通过截取视频Python代码进行截取,也可直接代码自动化分析起始帧与截止帧。
获取落体每一帧位置
采用计算机视觉识别模块获取落体垂直位置的前提为将帧图像转换为二值图像(黑白图像),通过代码 (c-24)*3动态调整阈值,可适应不同区域或光照条件的变化,以消除灰度模糊,使边界更加清晰。动态调整的代码需根据实验环境光线明暗程度进行细节上的调整。findContours方法中指定参数cv2.RETR_LIST,意味着检测不建立层级关系的所有轮廓,对检测得到的所有轮廓按照落体的水平位置及其大小进行筛选,符合要求的落体垂直位置进入待处理位置序列positions。
关键行代码如下:
#导入相关模块代码略
cap = cv2.VideoCapture("freefallby60f_capture.mp4")
fps = cap.get(cv2.CAP_PROP_FPS) #获取视频帧率
positions = [] # 存储落体的垂直位置,以像素数量为度量单位
times = [] # 存储落体垂直位置对应的时间
c=24
while cap.isOpened():
c+=1;ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
_, binary = cv2.threshold(gray, 90+(c-24)*3, 150, cv2.THRESH_BINARY) # 动态调整阈值
contours, _ = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
for i in contours:
(x, y, w, h) = cv2.boundingRect(i)
if 480<x<550 and 1000<w*h<40000: #过滤筛选得到落体轮廓
suitable_contour = i
positions.append(y) #记录落体垂直位置
times.append(len(times) / fps) # 记录时间
print(c,f"检测到物体:位置 ({x}, {y}), 大小 ({w}, {h})")
else:
print("未检测到物体!") # 调试信息
# 释放资源,代码略

按比例转换并进行拟合,获取重力加速度值
取得的落体位置序列以像素数量为单位,需根据视频图片软皮尺实际长度占用的像素数量比进行度量单位转换,然后交给scipy.optimize模块中的curve_fit函数,根据自由落体运动方程进行数据拟合,最终得到相应的重力加速度值。
数据分析可视化
为了能更加直观地看到自由落体运动状态下落距离与时间之间的关系,可以构建相应的图表。
实验数据处理分析与改进
经过动态阈值处理后,可获得落体在每一帧对应的垂直位置,帧序号与垂直位置对应关系见表1,采用该处理方式最后得到的重力加速度g值为7.854 m/s2,误差较大。
仔细观察落体视频帧,可发现在落体下落后期阶段,由于下落速度过快,拍摄画面中的落体出现拖影情况,截取前面8帧相对较为清晰落体对应的垂直位置,重新代入程序进行处理,得到重力加速度为9.354 m/s2,误差减小,但与理想的加速度值还有一定距离。
继续观察落体视频帧,发现在落体下落起始阶段,有微幅变动,但未计入表1,由于前2帧变动使用视觉处理模块不易提取垂直位置,故采用偏移帧序号与提取落体清晰帧方法,得到相关数据见表2,将其带入程序继续进行处理,得到重力加速度为9.921m/s2,与理想重力加速度值非常接近,可进一步考虑减小误差的方案。




实验回顾与拓展
本次实验的初衷是为了在信息科技实验室(如配备常规计算机与摄像头的机房)中,无需额外购置专业设备,即可通过数字化手段便捷、准确地测定重力加速度。实验基于视频分析技术,利用普通摄像头录制自由落体运动,并通过图像处理(如帧间位移追踪)结合数学模型拟合计算重力加速度。从实验过程与结果看,该方法能够有效获得接近理论值(9.8m/s2),验证了其可行性与实用性。
后续实验设计可充分拓展学生自主探究的空间。①技术参数优化:学生可对比不同视频帧率(如30 fps与. 60 fps)对重力加速度计算精度的影响,探究帧率与误差的关系。②变量控制研究:通过更换不同形状(球体、立方体)或质量(轻质泡沫、金属小球)的落体,分析空气阻力对结果的干扰,深化对理想模型与实际差异的理解。③算法改进:尝试用Python编写更高级的数据滤波(如滑动平均)或拟合算法(如加权最小二乘法),提升数据推理准确性。
本实验不仅能够培养学生的科学思维(假设—验证—分析),还强化了计算思维与数字化学习与创新能力(跨学科整合编程、物理与数据处理),为后续复杂实验(如考虑阻力修正的落体运动)奠定了基础。未来可进一步引入人工智能目标检测(如YOLO追踪落体)或多传感器融合(结合手机加速度计数据、自制光电门精确计时),拓展实验的精度与深度;也可以采用符号回归算法进行相关运动模型公式的推导。本文涉及的数据及相关程序代码可访问https://github.com/linkallatcn/cv_amga获得。■

来源: 中国青少年科技教育工作者协会