使用Python进行帧提取及指定帧插入实现文本隐写(CTF杂项出题方向)

news2024/9/25 7:18:03

视频是由一系列连续的图像帧组成的,每一帧都是视频的静止画面。这些帧以一定的速率播放,就形成了运动的视频。以下是视频帧的一些基本概念:

  1. 帧率(Frame Rate): 帧率表示每秒播放的图像帧数量。通常以“帧/秒”(fps)为单位。常见的视频帧率包括 24fps、30fps、60fps 等。较高的帧率可以提供更加流畅的动画效果。

  2. 分辨率(Resolution): 分辨率表示图像的宽度和高度。通常以像素为单位,例如,1920x1080 表示宽度为1920像素,高度为1080像素。视频的分辨率影响图像的清晰度。

  3. 关键帧(Key Frame): 关键帧是视频中特定时间点上的帧,这些帧是完整保存的图像。其他帧可能只存储与前一帧的差异(运动信息),以减小文件大小。关键帧通常出现在视频中的场景变化或运动明显的地方。

  4. 帧间压缩(Interframe Compression): 为了减小视频文件的大小,视频编码器通常使用帧间压缩技术。这种技术通过保存连续帧之间的差异来减小存储需求。帧间压缩包括预测运动、差分编码等技术。

  5. 播放速度(Playback Speed): 播放速度决定了视频的播放速率。较慢的播放速度会使视频变慢,而较快的播放速度会加速视频。这与帧率有关,但也可以通过调整帧率以外的参数来实现。

  6. 时长(Duration): 时长表示视频的总播放时间,通常以秒为单位。

首先附上一个可以提取出视频所有的帧的脚本

其中需要指定两个参数:video_path, output_folder

即原视频的位置路径和提取出来的帧输出的位置

import cv2
import os


def extract_frames(video_path, output_folder):
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 获取视频的帧率和总帧数
    fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 循环读取并保存每一帧
    for frame_number in range(total_frames):
        ret, frame = cap.read()

        # 如果成功读取帧,则保存
        if ret:
            frame_path = os.path.join(output_folder, f"frame_{frame_number:04d}.jpg")
            cv2.imwrite(frame_path, frame)
        else:
            break

    # 关闭视频流
    cap.release()


# 使用示例
video_path = 'D:/test/myon.mp4'
output_folder = 'D:/test/zhen'
extract_frames(video_path, output_folder)

我们演示一下使用上述代码进行帧提取 

这是一个7秒的视频,我们一个提取出了217帧

接下来我们尝试在指定某个帧的位置进行文本内容插入

代码如下:

import cv2

def insert_text_to_specific_frame(video_path, output_path, target_frame_number, text, font=cv2.FONT_HERSHEY_SIMPLEX, font_scale=2, color=(0, 0, 255), thickness=3):
    cap = cv2.VideoCapture(video_path)

    # 获取视频的基本信息
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 确保目标帧数在有效范围内
    if target_frame_number < 0 or target_frame_number >= total_frames:
        print("Error: Target frame number is out of range.")
        cap.release()
        return

    # 创建 VideoWriter 对象,用于保存插入文本后的视频
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    output = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

    # 逐帧读取视频,插入文本,并写入输出视频
    for frame_number in range(total_frames):
        ret, frame = cap.read()

        # 如果帧读取成功
        if ret:
            # 如果是目标帧,插入文本
            if frame_number == target_frame_number:
                text_size = cv2.getTextSize(text, font, font_scale, thickness)[0]
                text_position = ((width - text_size[0]) // 2, (height + text_size[1]) // 2)
                cv2.putText(frame, text, text_position, font, font_scale, color, thickness)

            # 写入输出视频
            output.write(frame)
        else:
            print(f"Error: Unable to read frame {frame_number} from input video.")
            break

    # 释放资源
    cap.release()
    output.release()

# 使用示例,假设在第50帧插入文本
insert_text_to_specific_frame('d:/test/myon.mp4', 'd:/test/output_video.mp4', target_frame_number=49, text='Hello, CTF!')

注意:需要对 video_path, output_path, target_frame_number 进行替换;

第一个参数为原视频路径,第二个参数为视频输出的路径,第三个参数指定插入位置;

从0开始计为第一帧,假设我们插入到第50帧则对应的number为49。

对插入文本内容后的视频进行帧提取得到结果如下图:

其实单独看这个视频,也是可以发现插入的内容的:(因为我这里刻意做得很明显)

这个插入文本内容的位置及字体大小颜色我们是可以进行设置的 

将文本插入到视频帧中的位置通常选择在图像的较为平坦或者复杂的区域,以减小插入内容对整体图像的影响,提高隐蔽性。以下是一些可能的插入位置:

  1. 底部边缘: 在视频帧的底部边缘添加文本,这是比较常见的位置。

  2. 角落: 将文本放置在视频帧的角落,可以选择左上、右上、左下或右下,这样的位置相对不引人注意。

  3. 运动模糊区域: 在视频中存在运动的部分,尤其是高速运动的区域,可以选择在这些区域插入文本,运动模糊可以帮助隐藏文本的存在。

  4. 复杂纹理区域: 选择视频帧上的复杂纹理区域,比如树叶、花纹等,可以使插入的文本相对不容易被察觉。

  5. 颜色变化不显著的区域: 选择颜色变化不太显著的区域,例如天空、墙壁等,可以减小插入内容对整体图像的影响。

  6. 对比度低的区域: 在对比度较低的区域插入文本,可以减小文本与周围图像的差异,提高隐蔽性。

顺便说一下:有些播放器存在缺陷,会自动删减掉最后几帧,导致我们无法观察到隐写的东西,因此我们也常将一些关键信息藏在视频结尾。

上述视频一个有217帧,比如我将文本内容插到第216帧,对应数字215:

如下图,尽管我开了0.5倍半速播放,但是视频结尾的内容依旧被省略了

有些肉眼无法识别到的东西只有通过提取视频的帧来获取

可能这个东西很简单吧但这确实可以作为CTF出题的方向

我也遇到过这类题,如下图

所以这里分享给大家也了解一下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1263320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

【JavaEE初阶】——Linux 基本使用和 web 程序部署(下)

文章目录 前言一、Linux 常用命令 1.1 ls 命令 1.2 pwd 命令 1.3 cd 命令 1.4 touch 命令 1.5 cat 命令 1.6 mkdir 命令 1.7 rm 命令 1.8 cp 命令 1.9 mv 命令 1.10 man 命令 1.11 less 命令 1.12 head 命令 1.13 tail 命…

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想&#xff1a; 上面next cur->next应该放在cur->next pre前面执行&#xff0c;这里笔误 再来说递归的思想&#xff1a; 题目代码 这个代码里面我加了我自己写的测试数据&#xff0c;自己可以去找对应的部分&#xff0c…

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…

集结!Milvus 老友汇 · 线下 Meetup 来袭

AGI 时代&#xff0c;当“大模型的记忆体”——向量数据库&#xff0c;邂逅 Cloud-Native 的数据管理平台及 AI-Native 的应用&#xff0c;会迸发出怎样的化学反应&#xff1f; 12 月 9 日&#xff01;上海&#xff01;Milvus 社区携手 KubeBlocks 社区&#xff0c;集结来自两大…

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器 文章目录 可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 …

OpenCvSharp从入门到实践-(05)通道

目录 1、拆分通道 1.1、实例1-拆分一副BGR图像的通道 1.2、实例2-拆分一副HSV图像的通道 2、合并通道 2.1 实例3-合并通道的顺序不同&#xff0c;图像的显示效果也不通 实例4-合格H通道图像、S通道图像、V通道图像 3、综合运用拆分通道和合并通道 2.2、实例5-只把H通道的…

Windows10免安装PostgreSQL

1. PostgreSQL简介2. 下载3. 安装环境4. 安装 4.1. 初始化数据库4.2. 启动数据库4.3. 注册服务4.3. 卸载服务 1. PostgreSQL简介 PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff0c;是以加州大学计算机系开发的 POSTGRES 4.2版本为基础的对象关…

羽隔已就之图像处理之BP神经网络入门

小y最近非常忙&#xff0c;这一年来&#xff0c;活很多&#xff0c;一直在加班、出差&#xff0c;也没好好休息过。最近在武汉出差一个多月了&#xff0c;项目逐渐完结&#xff0c;有点闲时间了&#xff0c;回首望&#xff0c;这一年设定的很多目标都没完成。 还记得&#xff0…

智慧博物馆视频监控系统设计,可视化AI智能分析技术助力博物馆多维度监管

一、背景与需求 博物馆视频智能监控系统是智慧博物馆建设的重要组成部分&#xff0c;传统的博物馆视频监控系统以模拟系统架构为主&#xff0c;存在监管效率低、各个系统独立运作形成数据孤岛、以“事后补救”为主要监管手段等管理弊病&#xff0c;无法满足互联网高速发展背景…

如何获取高质量的静态住宅IP代理?常见误区与注意事项

静态住宅IP代理在今天的网络营销领域扮演着至关重要的角色&#xff0c;静态住宅IP代理以其稳定性和高匿名性&#xff0c;为互联网业务提供了一个安全的执行环境。通过模拟真实用户的网络行为&#xff0c;这些IP代理降低了企业在网络营销活动中被识别和封禁的风险。它保护了企业…

Postgresql数据库运维统计信息

如果需要使用以下运维信息&#xff0c;需要如下几步 修改postgresql.conf文件 #shared_preload_libraries # (change requires restart)shared_preload_libraries pg_stat_statements重启数据库创建扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;1. 统计信息…

java: Internal error in the mapping processor: java.lang.NullPointerException

启动java项目出错&#xff0c;其他人工程没有问题&#xff0c;别着急。 java: Internal error in the mapping processor: java.lang.NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifestUrl(DefaultVersionInformation.j…

微信如何养号?

目前导致微信封号的几点原因如下&#xff1a; 1.使用虚拟定位软件&#xff0c;进行附近人任务&#xff0c;频繁的切换ip&#xff0c;极易被判定微信被盗,对其封号 2.频发的群发骚扰消息&#xff0c;朋友圈发送过于频繁&#xff0c;给别人造成骚扰及其投诉 3.和微信好友聊天涉…

Python接口自动化测试 ---Allure报告使用详解

这一节主要是记录allure的内容以及用法&#xff0c;怎么让他生成一个完整的想要的报告。 allure生成的报告和其他五花八门的报告对比了一下&#xff0c;它的可读性是最好、最直观的。这不仅仅是我想要的效果&#xff0c;也是很多小伙伴想要的结果&#xff0c;毕竟这是给领导看…

JSON详细教程

&#x1f60a;JSON详细教程 &#x1f6a9;JSON简介☃️JSON语法规则&#x1f50a;JSON和JavaScript对象的区别 ☃️JSON数据类型字符串&#x1f50a;数字&#x1f50a;布尔值&#x1f50a;数组&#x1f50a;对象&#x1f50a;Null ☃️JSON对象&#x1f50a;访问JSON对象的值&a…

Linux脚本sed命令

目录 一. sed命令定义 二. sed命令选项 三. sed语法选项 四. 案例解释 1. 打印奇数或偶数行 2. 打印固定行数 3. 打印包含字符的行 4. 打印特定字符首尾行 5. 删除固定行数 6. 删除特定字符行 7. 插入在固定行中 8. 替换规定行数 9. 使用变量 10. 多点编辑 11. 分…

研究前沿|NAR:一个综合性的植物代谢组数据库

引言 2023年10月&#xff0c;华中农业大学小麦改良创新团队陈伟教授课题组在Nucleic Acids Research发表题为“PMhub 1.0: a comprehensive plant metabolome database”的文章&#xff0c;系统介绍了他们开发的植物代谢分析网站&#xff08;PMhub&#xff09;的功能与价值。P…

【AICFD案例教程】水冷板散热分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

基于SpringBoot的手机官方商城系统

基于SpringBoot的手机官方商城系统 摘要&#xff1a;随着电子商务的发展&#xff0c;网上购物已成为人们普遍的购物方式。与此同时&#xff0c;网上支付也得到了迅速的发展&#xff0c;大有赶超传统支付的趋势。在今天这个信息化程度高、生活节奏快的现代社会&#xff0c;传统…