You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())

关键细节解释

  1. 时间戳计算:通过cap.get(cv2.CAP_PROP_FPS)获取视频帧率,每帧的时间戳 = 帧索引 / 帧率,精确对应视频中的时刻。
  2. 按帧分组处理:每帧初始化独立的点列表,避免不同帧的数据混淆,确保每个时刻的参数只对应当前帧的轮廓。
  3. 空值处理:若某帧无有效轮廓点,用NaN填充参数,避免报错同时保留时间序列的完整性。
  4. 结构化输出:最终Excel中每行对应一个时刻,包含时间戳、最大y、最左x、最右x,直接满足后续分析需求。

内容的提问来源于stack exchange,提问作者Nikita Zhdanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:08:14