写一段利用python语言,读取悬臂梁振动冲击视频,利用圆心标靶检测算法提取结构6个测点的位移并绘制每个测点的位移曲线的算法
时间: 2024-03-10 11:49:24 浏览: 121
好的,下面是利用Python语言实现读取悬臂梁振动冲击视频,提取6个测点位移并绘制位移曲线的算法:
首先,需要安装OpenCV和Matplotlib库来读取视频和绘制曲线,可以使用以下命令进行安装:
```
pip install opencv-python
pip install matplotlib
```
然后,我们可以使用以下代码来读取视频并提取测点位移:
```python
import cv2
import numpy as np
# 读取视频
cap = cv2.VideoCapture('video.mp4')
# 设置圆心标靶检测参数
params = cv2.SimpleBlobDetector_Params()
params.minThreshold = 10
params.maxThreshold = 200
params.filterByArea = True
params.minArea = 10
params.filterByCircularity = True
params.minCircularity = 0.8
params.filterByConvexity = True
params.minConvexity = 0.87
params.filterByInertia = True
params.minInertiaRatio = 0.01
# 创建圆心标靶检测器
detector = cv2.SimpleBlobDetector_create(params)
# 定义六个测点的坐标
points = [(260, 190), (290, 190), (320, 190), (350, 190), (380, 190), (410, 190)]
# 定义每个测点的位移列表
displacements = [[] for _ in range(len(points))]
while True:
# 读取视频帧
ret, frame = cap.read()
if not ret:
break
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
for i, (x, y) in enumerate(points):
# 提取测点周围的圆心标靶
roi = gray[y-10:y+10, x-10:x+10]
keypoints = detector.detect(roi)
if keypoints:
# 提取圆心坐标并计算位移
center = keypoints[0].pt
displacement = np.sqrt((center[0]-10)**2 + (center[1]-10)**2)
displacements[i].append(displacement)
# 显示视频帧
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
上述代码中,我们首先读取视频并设置圆心标靶检测参数,然后创建圆心标靶检测器。接着,我们定义了六个测点的坐标,并创建了一个空列表用于存储每个测点的位移。在每一帧视频中,我们首先将图像转换为灰度图像,然后对每个测点周围的圆心标靶进行检测,并提取圆心坐标。最后,我们计算了每个测点的位移,并将其存储在对应的列表中。
接下来,我们可以使用Matplotlib库来绘制每个测点的位移曲线:
```python
import matplotlib.pyplot as plt
# 绘制位移曲线
for i, displacement in enumerate(displacements):
plt.plot(displacement, label=f'point{i+1}')
plt.legend()
plt.xlabel('Frame')
plt.ylabel('Displacement')
plt.show()
```
上述代码中,我们首先使用for循环遍历每个测点的位移列表,并使用plt.plot()函数绘制曲线。最后,我们使用plt.legend()函数添加图例,并使用plt.xlabel()和plt.ylabel()函数添加坐标轴标签。运行完整代码后,我们就可以得到每个测点的位移曲线了。
阅读全文