Python OpenCV视频气泡特定坐标提取需求实现求助
解决方案
核心改动说明
原代码将所有帧的轮廓点存入同一个列表,无法区分不同时刻的数据。我们需要按帧处理数据,结合视频帧率计算时间戳,同时记录每帧的目标参数:
- 计算每帧对应的时间戳(基于视频帧率)
- 对每帧的有效轮廓点,单独提取最大y、最左x、最右x
- 将每帧的结果结构化存储,最终输出到Excel
修改后的完整代码
import cv2 import numpy as np import pandas as pd cap = cv2.VideoCapture('bubble_cut_1mov.mp4') # 获取视频帧率,用于计算时间戳 fps = cap.get(cv2.CAP_PROP_FPS) # 存储每帧的结果:时间戳、max_y、min_x、max_x frame_results = [] ret, frame = cap.read() height, width, _ = frame.shape x_center, y_center = width // 2, height // 2 x_min, x_max = x_center - 50, x_center + 50 y_min, y_max = y_center - 50, y_center + 50 # 记录当前帧索引 frame_idx = 0 while ret: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 150) # 找到轮廓 contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 初始化当前帧的有效点列表 current_frame_x = [] current_frame_y = [] for contour in contours: for point in contour: x, y = point.ravel() # 筛选指定区域外的点(和原逻辑一致) if x < x_min or x > x_max or y < y_min or y > y_max: current_frame_x.append(x) current_frame_y.append(y) cv2.drawContours(frame, [contour], -1, (0, 255, 0), 1) # 计算当前帧的时间戳 timestamp = frame_idx / fps # 计算当前帧的目标参数,若无有效点则用NaN填充 if current_frame_x and current_frame_y: max_y = max(current_frame_y) min_x = min(current_frame_x) max_x = max(current_frame_x) else: max_y = np.nan min_x = np.nan max_x = np.nan # 将当前帧结果加入列表 frame_results.append({ 'timestamp(s)': timestamp, 'max_y': max_y, 'min_x': min_x, 'max_x': max_x }) cv2.imshow('Contours from video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break ret, frame = cap.read() frame_idx += 1 cap.release() cv2.destroyAllWindows() # 转换为DataFrame并输出到Excel df = pd.DataFrame(frame_results) df.to_excel('frame_bubble_data.xlsx', index=False) # 可选:打印前5行结果预览 print(df.head())
关键细节解释
- 时间戳计算:通过
cap.get(cv2.CAP_PROP_FPS)获取视频帧率,每帧的时间戳 = 帧索引 / 帧率,精确对应视频中的时刻。 - 按帧分组处理:每帧初始化独立的点列表,避免不同帧的数据混淆,确保每个时刻的参数只对应当前帧的轮廓。
- 空值处理:若某帧无有效轮廓点,用
NaN填充参数,避免报错同时保留时间序列的完整性。 - 结构化输出:最终Excel中每行对应一个时刻,包含时间戳、最大y、最左x、最右x,直接满足后续分析需求。
内容的提问来源于stack exchange,提问作者Nikita Zhdanov
相关产品推荐
相关产品推荐

