使用opencv解析视频,通过图片比对,筛选出每一帧视频的变化

news/2025/2/9 8:05:57 标签: opencv, 音视频, 人工智能

记录瞬间

最近碰到一个问题,在客户端上操作时,存在背景判断的情况,对自动化实现此操作增加难度。

所以考虑到实际的使用,将一些计算机视觉技术加入到实际的使用中,来解决此问题。

import os
import cv2
import numpy


# 打开视频文件
video = cv2.VideoCapture('./video/path.mp4')
phone_width = 1080      # 手机设备的宽度
phone_height = 2400     # 手机设备的高度
# 获取视频的帧率和尺寸
fps = video.get(cv2.CAP_PROP_FPS)
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("fps:", fps, "width:", width, "height:", height)

# 创建VideoWriter对象以保存提取的帧为新的视频文件
# output = cv2.VideoWriter('path_to_output_file.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
count = 0
# 循环读取视频帧并保存
while video.isOpened():
    ret, frame = video.read()

    if not ret:
        break

    # 将帧写入输出文件
    # output.write(frame)

    # 显示帧(可选)
    # cv2.imshow('Video', frame)
    new_img = frame[:phone_height, :phone_width, :]
    cv2.imwrite(f"./image/{count}.png", new_img)
    count += 1

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
video.release()
# output.release()
cv2.destroyAllWindows()

"""
# 以下是判断图片内容,以第一个图片为准,其他图片作为对比结果,对比相似度
# 但是此方法需要设定一个对比的相似度的值,不是很能说明问题,这个值的取值怎么定,为啥这么定,谁能给出解释?
all_values = {}
img0 = "./image/0.png"
read_img0 = cv2.imread(img0)
H1 = cv2.calcHist([read_img0], [1], None, [256], [0, 256])
H1 = cv2.normalize(H1, H1, 0, 1, cv2.NORM_MINMAX, -1)
for img in os.listdir("./image"):
    compare = cv2.imread(f"./image/{img}")
    H2 = cv2.calcHist([compare], [1], None, [256], [0, 256])
    H2 = cv2.normalize(H2, H2, 0, 1, cv2.NORM_MINMAX, -1)
    similarity = cv2.compareHist(H1, H2, 0)
    if similarity > 0.99:
        try:
            all_values[similarity] = f"./image/{img}"
        except:
            print(f"存在相同的key值{similarity}的数据,预判一下这个预判。好像也没啥用")
            continue
    else:
        print(f"./image/{img}", similarity)

keys = list(all_values.keys())
keys.sort()
print(keys[0], keys[-1], all_values[keys[0]], all_values[keys[-1]])
for data in keys:
    print(all_values[data])
"""

def match_template(source, template, threshod=0.9, method=cv2.TM_CCOEFF_NORMED):
    """
    返回小图左上角的点,在大图中的坐标。
    :param threshod: 相似度
    :param template: 目标对比图片
    :param source: 原始图片
    :param method:
    :return: list[tuple(x,y),...]
    """
    try:
        result = cv2.matchTemplate(source, template, method)
        locations = numpy.where(result >= threshod)
        res = list(zip(locations[1], locations[0]))  # 返回的是匹配到的template左上角那个坐标点在image中的位置,可能有多个值
        return res
    except cv2.error as e:
        print(e)

# 另一个方法,是可以通过某一个图片的坐标来判断,主要是判断y坐标的最大值变化,来进行实际操作
img0 = "./image/0.png"
source = cv2.imread(img0, cv2.IMREAD_UNCHANGED)
images = ["./image/pic_path.png", "./image/pic_path.png"]      # 判断一个不变的元素图片
exist_img = ""
for img in images:
    template = cv2.imread(img, cv2.IMREAD_UNCHANGED)
    get_pos = match_template(source, template)
    print(get_pos)
    if len(get_pos) > 0:
        exist_img = img
if len(exist_img) > 0:
    target = cv2.imread(exist_img, cv2.IMREAD_UNCHANGED)
    max_y_pos = 0
    max_target_image = ""
    for img in os.listdir("./image"):
        temp_img = cv2.imread(f"./image/{img}", cv2.IMREAD_UNCHANGED)
        get_pos = match_template(temp_img, target, threshod=0.86)
        print(get_pos, img)
        try:
            if get_pos[0][1] > max_y_pos:
                max_y_pos = get_pos[0][1]
                max_target_image = img
        except:
            print(img)

    print(max_target_image, max_y_pos)

其中图片相似的判断方法,可以参考:https://blog.csdn.net/qq_39706141/article/details/118730137

以上简单的代码逻辑,实现了设备录屏后,抓取视频文件,解析视频每一帧,并保存每一帧为图片,后续将图片进行解析,判断固定元素在图片中 纵坐标的最大值,即为查看结果的最终图片数据。

录屏可以通过客户端工具如 airtest、appium等。

from airtest.core.api import *
import time

auto_setup(__file__)

init_device(platform="Android", uuid="phoneid")
dev = device()

wake()
stop_app('appname')
start_app('appname')

sleep(3.0)

touch(Template(r"pic.png", record_pos=(-0.002, 1.046), resolution=(1080, 2400)))

# 录屏开始
dev.start_recording()

swipe(Template(r"pic_swipe.png", record_pos=(0.002, 0.076), resolution=(1080, 2400)), vector=[0.0722, 0.3658], duration=1.0)
sleep(8.0)

# 结束录屏
dev.stop_recording()


http://www.niftyadmin.cn/n/5845804.html

相关文章

车机音频参数下发流程

比如以audioControlWrapper.setParametersToAmp(keyPairValues); 下发banlance为例,链路如下 hal层 1. AudioControl.cpp hardware\interfaces\automotive\audiocontrol\aidl\default\AudioControl.cpp ndk::ScopedAStatus AudioControl::setParametersToAmp(co…

算法与数据结构(字符串相乘)

题目 思路 这道题我们可以使用竖式乘法,从右往左遍历每个乘数,将其相乘,并且把乘完的数记录在nums数组中,然后再进行进位运算,将同一列的数进行相加,进位。 解题过程 首先求出两个数组的长度,…

【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率

在IC设计项目的验证过程中,功能测试(通过使用测试平台)有助于定位设计错误或漏洞。这个验证过程有三个阶段:构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段,漏洞很容易被检测到,因…

Python实现GO鹅优化算法优化支持向量机SVM回归模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的世界中,机器学习技术被广泛应用于各种领域,如金融、医疗、…

开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。

一、明确游戏定位与核心玩法 游戏类型 MOBA(Multiplayer Online Battle Arena):强调团队合作、策略性和即时战斗。确定游戏模式(如5v5、3v3等)和地图设计。 核心玩法 角色设计:英雄技能、属性、成长曲线。…

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…

知识图谱智能应用系统:数据分析与挖掘技术文档

一、概述 在知识图谱智能应用系统中,数据分析与挖掘模块是实现知识发现和智能应用的核心环节。该模块负责处理和分析来自数据采集与预处理模块的结构化和半结构化数据,提取有价值的知识,并将其转化为可用于知识图谱构建和应用的三元组数据。本技术文档详细介绍了数据分析与…

dijkstra算法类型题解

dijkstra算法(有权图,无权图): 带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度 初始化三个数组,final标记各顶点是否已找到最短路径,dist最…