写一段利用python语言,读取悬臂梁振动冲击视频,利用圆心标靶检测算法提取结构6个测点的位移并绘制每个测点的位移曲线的算法
时间: 2023-12-03 13:44:49 浏览: 35
下面是一个基于Python和OpenCV的算法,可以读取悬臂梁振动冲击视频,利用圆心标靶检测算法提取结构6个测点的位移并绘制每个测点的位移曲线。
1.首先,我们需要导入必要的库:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
```
2.读取视频文件并提取每一帧:
```python
cap = cv2.VideoCapture('video.mp4')
frames = []
while True:
ret, frame = cap.read()
if not ret:
break
frames.append(frame)
```
3.定义圆心标靶检测函数,该函数接受一帧图像并返回所有检测到的圆心坐标:
```python
def detect_circles(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20,
param1=50, param2=30, minRadius=5, maxRadius=30)
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
return circles
```
4.对每一帧进行圆心标靶检测,并提取6个测点的坐标:
```python
points = []
for frame in frames:
circles = detect_circles(frame)
if circles is not None:
for circle in circles:
x, y, r = circle
if r > 10:
points.append((x, y))
if len(points) == 6:
break
```
5.对于每个测点,提取其在每一帧中的坐标,并计算其位移:
```python
displacements = [[] for _ in range(6)]
for frame in frames:
circles = detect_circles(frame)
if circles is not None:
for i, point in enumerate(points):
min_dis = np.inf
for circle in circles:
x, y, _ = circle
dis = np.sqrt((x - point[0]) ** 2 + (y - point[1]) ** 2)
if dis < min_dis:
min_dis = dis
nearest_circle = circle
_, _, r = nearest_circle
if r > 10:
displacements[i].append(r)
else:
for i in range(6):
displacements[i].append(np.nan)
```
6.绘制每个测点的位移曲线:
```python
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(15, 8))
for i, ax in enumerate(axs.flatten()):
ax.plot(displacements[i])
ax.set_title(f"Point {i+1}")
plt.tight_layout()
plt.show()
```
完整代码如下: