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

如何用OpenCV判断视频中物体是否跨区域切换(附示例代码)

实现思路与代码示例

1. 核心原理:点与多边形的位置判断

用OpenCV内置的cv2.pointPolygonTest()函数就能直接判断点和多边形的位置关系:

  • 返回值>0:点在多边形内部
  • 返回值=0:点在多边形边上
  • 返回值<0:点在多边形外部

结合你的示例图,我们可以直接对应:

  • 返回值>0 → 物体在区域B
  • 返回值<0 → 物体在区域A
    (如果需要调整区域对应逻辑,直接修改判定规则即可)

2. 逐帧检测与区域切换判断流程

  1. 提前定义分割区域的多边形(和你示例图的轮廓完全一致)
  2. 保存上一帧物体所在的区域标记
  3. 遍历每一帧的物体坐标,用pointPolygonTest判断当前区域
  4. 对比当前区域和上一区域,若不一致则判定为区域切换

3. 完整可运行代码

import cv2
import numpy as np

# 定义分割区域的多边形(和你示例图的轮廓完全匹配)
split_polygon = np.array([(0, 200), (100, 200), (300, 400), (400, 600), (0, 800)], dtype=np.int32)

# 模拟视频帧的物体坐标列表(实际使用时替换为你的逐帧坐标数据)
object_frame_coords = [(300, 500), (350, 450), (500, 300), (600, 200), (550, 250), (300, 500)]

# 初始化上一帧的区域标记
prev_region = None

for frame_idx, (obj_x, obj_y) in enumerate(object_frame_coords):
    # 判断当前点的区域:measureDist=False时只返回位置状态,计算更快
    point_status = cv2.pointPolygonTest(split_polygon, (obj_x, obj_y), measureDist=False)
    
    # 映射为区域标记
    current_region = None
    if point_status > 0:
        current_region = "B"
    elif point_status < 0:
        current_region = "A"
    else:
        current_region = "边界"  # 可根据业务需求自定义边界处理规则
    
    print(f"第{frame_idx+1}帧:物体位于区域{current_region}")
    
    # 检测区域切换事件
    if prev_region is not None and current_region != prev_region:
        print(f"⚠️ 第{frame_idx+1}帧发生区域切换:{prev_region} → {current_region}")
    
    # 更新上一区域标记
    prev_region = current_region

4. 关键细节说明

  • 多边形格式要求:必须是np.int32类型的二维数组,注意OpenCV中坐标是(x, y)(对应图像的列、行),和你示例代码的坐标逻辑一致
  • 性能优化:measureDist=False时仅返回位置状态,比返回距离值的计算速度快很多,适合实时视频处理
  • 边界场景处理:如果物体刚好落在分割线上(返回值=0),可以根据需求归为A、B区域,或者单独标记处理
  • 实际视频适配:只需把示例中的object_frame_coords替换为你从视频帧中提取的目标坐标即可(比如目标检测输出的 bounding box 中心)

内容的提问来源于stack exchange,提问作者Guilherme Augusto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:12:09