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

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

  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出题的方向

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文章采集器-免费的文章采集工具大全

在当今信息爆炸的时代&#xff0c;获取有效的信息变得尤为关键。随之而来的问题是&#xff0c;如何高效地从海量信息中筛选出我们所需的内容呢&#xff1f;文章采集器应运而生&#xff0c;它就像是信息世界中的一把神奇的筛子&#xff0c;能够帮助我们从大海一般的信息中捞取我…

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

免费四款国内AI写作工具,初涉自媒体的新手必备

许多初涉自媒体的新手在运营中时常感到困扰&#xff1a;每天都在不停地输出内容&#xff0c;却早已陷入了不知道写或拍什么的迷茫。如果你也面临着这样的烦恼&#xff0c;那么不妨尝试以下四款国内AI写作工具&#xff0c;它们不仅能助你轻松创作文章&#xff0c;仅需3分钟即可完…

asp.net mvc游戏门户网站

c#asp.net mvc 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发三层架构BLL DAL 功能模块&#xff1a; 前端展示首页 新闻公告 英雄档案 视频图片 管理…

同为科技(TOWE)模块化定制化让每条PDU实现专属供电解决方案

作为追求最高功率和空间效率的动态数据中心的理想产品&#xff0c;模块化、定制化PDU是追求最高功率和空间效率的动态数据中心的理想产品。同为科技&#xff08;TOWE&#xff09;是我国PDU行业的开创者和领导者&#xff0c;曾率先于中国电源分配单元http://www.pdu.com.cn网站上…

运维 | 四层和七层负载均衡介绍

关注: CodingTechWork 负载均衡 负载均衡介绍 概念 负载均衡是建立在现有的网络结构之上&#xff0c;提供一种廉价且透明的方式进行网络设备和服务器带宽的扩展&#xff0c;从而增加吞吐量&#xff0c;加强应用服务的数据处理能力&#xff0c;有效提高网络的灵活性和可用性。…

Webshell混淆免杀的一些思路

简介 为了避免被杀软检测到&#xff0c;黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路&#xff0c;帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段&#xff0c;使其在静态分析阶段难以被杀毒软件或安…

SQL注入-HTTP头注入

目录 HTTP Header概述 HTTP Header注入 HTTP Header注入概述 HTTP Header注入实例 HTTP Header概述 HTTP工作原理 HTTP请求方法 HTTP报文类型 请求报文&#xff08;HTTP Request&#xff09;&#xff1a;由客户端发给服务器的消息&#xff0c;其组成包括请求行&#xff08;R…

pikachu靶场:php反序列化漏洞

pikachu靶场:php反序列化漏洞 文章目录 pikachu靶场:php反序列化漏洞代码审计漏洞利用 代码审计 像这种反序列化的代码基本都是代码审计出的 // 定义一个名为S的类&#xff0c;该类有一个属性$test和一个构造函数 class S{ var $test "pikachu"; // $test是一个…

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

flutter布局详解及代码示例(上)

布局 基本布局 Row&#xff08;水平布局&#xff09;&#xff1a;在水平&#xff08;X轴&#xff09;方向上排列子widget的列表。Column&#xff08;垂直布局&#xff09;&#xff1a;在垂直&#xff08;Y轴&#xff09;方向上排列子widget的列表。Stack&#xff08;可重叠布…

①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态

个人简介&#xff1a;Java领域优质创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 登录功能 实现 实现基于session的登录流程&…

JS:获取当前日期是本年度的第几周

问题 根据当前的日期&#xff08;比如年月日&#xff09;&#xff0c;来得到当前日期属于本年度的第几周 解决 代码&#xff1a; // 获取当前日期是本年的第几周 //参数&#xff1a; a为年 b为月 c为日 function getYearWeek(a, b, c) {var date1 new Date(a, parseInt(b)…

通过火狐Firefox浏览器在设备间留言、传递备注消息

如果多台设备间没有都安装微信、飞书这种可以通过文件传输助手备注消息的APP&#xff0c;那么可通过火狐浏览器在设备间留言。 原理&#xff1a;火狐支持把当前设备的一个浏览器标签页发送到其他设备 那么我们只需要把要留言的文本记录到一个网页&#xff0c;然后发送到其他设…

【前端首屏加载速度优化(0): 谷歌浏览器时间参数】

DOMContentLoaded 浏览器已经完全加载了 HTML&#xff0c;DOM树构建完成&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 Load DOM树构建完成后&#xff0c;继续加载 html/css 中的外部资源&#xff0c;加载完成之后&#xff0c;视为页面加载完成。…

四川开启智能巡河形式,无人机水利行业应用再创新

在四川省某区域&#xff0c;复亚智能无人机系统以其独特的机场网格化部署得到成功应用&#xff0c;覆盖了该区域内多条市级、省级河流&#xff0c;成为水利行业的新亮点。这一先进系统以无人机水利行业应用为核心&#xff0c;通过网格化和信息化手段&#xff0c;实现了对水域环…

吉利展厅 | 透明OLED拼接2x2:科技与艺术的完美融合

产品&#xff1a;4块55寸OLED透明拼接屏 项目地点&#xff1a;南宁 项目时间&#xff1a;2023年11月 应用场景&#xff1a;吉利展厅 在2023年11月的南宁&#xff0c;吉利展厅以其独特的展示设计吸引了众多参观者的目光。其中最引人注目的亮点是展厅中央一个由四块55寸OLED透…

Mysql并发时常见的死锁及解决方法

使用数据库时&#xff0c;有时会出现死锁。对于实际应用来说&#xff0c;就是出现系统卡顿。 死锁是指两个或两个以上的事务在执行过程中&#xff0c;因争夺资源而造成的一种互相等待的现象。就是所谓的锁资源请求产生了回路现象&#xff0c;即死循环&#xff0c;此时称系统处于…

Jetpack Compose中适应性布局的新API

Jetpack Compose中适应性布局的新API 针对大屏幕优化的新组合件。 使用新的Material适应性布局&#xff0c;为手机、可折叠设备和平板电脑构建应用程序变得更加简单&#xff01;市场上各种不同尺寸的Android设备的存在挑战了构建应用程序时对屏幕尺寸的通常假设。开发者不应该…

AI辅助工具

任务拆解工具 Magic ToDo - GoblinTools 可用的AI搜索和对话工具&#xff1a;chatgpt 梦畅AI