ffmpeg抠图

1.不用png,用AVFrame
2.合流
3.图片抠图透明 (1.)mp4扣yuv图,(2)用1.把一张yuv标记为透明然后av_hwframe_transfer_data到GPU (3)用抠图算法函数对yuv进行处理 (4)
qsv的h264_qsv只支持nv12和qsv,但qsv本身并不限制像素格式,比如在qsv里可以用vpp_qsv=format输出各种像素格式。因此以上第二种方法可能可行。
av_hwframe_transfer_data转换不了可能是硬件帧函数配置的像素格式出的问题。

ffmpeg -y   -i TJTV.png -vf  colorkey=0x0000FF:0.5:0.0    -c:v png t.png

0x0000FF:六位每两位分别表示红绿蓝,因此它是对rgb像素进行透明标记。
0.5表示蓝色的范围容差值,范围为0.01-1,数值越大,容错越大。
0.0是alpha通道的阀值,为0表示完全透明,实测这个值作用不明显。
对于TJTV.png,可以看到它的编码和封装方式都是png,它的像素格式为rgba。

Stream #0:0: Video: png, rgba(pc), 280x279 [SAR 2835:2835 DAR
280:279], 25 fps, 25 tbr, 25 tbn

这个命令只能对rgb的像素格式进行透明标记,但是对yuv得不能,会导致花屏。只有argb、rgba等带透明度格式的像素格式才能进行抠图透明标记。
透明的原理是对rgb数据逐个像素处理,修改rgb值,达到对特定的像素进行透明标记。
透明的原理是对rgb或yuv增加第四个Alpha通道,这个通道的值由一个byte表示,不同的值表示透明程度不同,Alpha的值与其他yuv、rgb值作用来改变灰阶度来达到透明效果。
chromakey与colorkey的区别,官网给了这四个例子

ffmpeg -i input.png -vf colorkey=green out.png
ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv
ffmpeg -i input.png -vf chromakey=green out.png
ffmpeg -f lavfi -i color=c=black:s=1280x720 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mkv

clolorkey是对yuv数据进行处理,但它的三个参数值依然和colorkey同样的用法。对yuv进行透明标记后,如果再次编码,那么标记就会失效。同时如果对rtb图像进行标记后,如果转为yuv,则标记同样失效并且花屏。
以下是去除绿色背景。

在这里插入图片描述


ffmpeg -h filter=colorkeyFilter colorkeyTurns a certain color into transparency. Operates on RGB colors.slice threading supportedInputs:#0: default (video)Outputs:#0: default (video)
colorkey AVOptions:color             <color>      ..FV.....T. set the colorkey key color (default "black")similarity        <float>      ..FV.....T. set the colorkey similarity value (from 1e-05 to 1) (default 0.01)blend             <float>      ..FV.....T. set the colorkey key blend value (from 0 to 1) (default 0)
ffmpeg -h filter=chromakeyFilter chromakeyTurns a certain color into transparency. Operates on YUV colors.slice threading supportedInputs:#0: default (video)Outputs:#0: default (video)
chromakey AVOptions:color             <color>      ..FV.....T. set the chromakey key color (default "black")similarity        <float>      ..FV.....T. set the chromakey similarity value (from 1e-05 to 1) (default 0.01)blend             <float>      ..FV.....T. set the chromakey key blend value (from 0 to 1) (default 0)yuv               <boolean>    ..FV.....T. color parameter is in yuv instead of rgb (default false)

第四个参数默认为false,也就是前面传递的是grb信号值,如果为true的话,颜色传递的信号已经是YUV而不是RGB。像"green"或"red"这样的字面颜色不再有意义了。 这可以用于将精确的YUV值作为十六进制数传递。

附录:
1.ffmpeg滤镜chromakey针对yuv处理,将对应像素点标记透明。

typedef struct ColorkeyContext {const AVClass *class;/* color offsets rgba */int co[4];uint8_t colorkey_rgba[4];float similarity;float blend;
} ColorkeyContext;static uint8_t do_chromakey_pixel(ChromakeyContext *ctx, uint8_t u[9], uint8_t v[9])
{double diff = 0.0;int du, dv, i;for (i = 0; i < 9; ++i) {du = (int)u[i] - ctx->chromakey_uv[0];dv = (int)v[i] - ctx->chromakey_uv[1];diff += sqrt((du * du + dv * dv) / (255.0 * 255.0 * 2));}diff /= 9.0;if (ctx->blend > 0.0001) {return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * 255.0;} else {return (diff > ctx->similarity) ? 255 : 0;}
}
static int do_chromakey_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
{AVFrame *frame = arg;const int slice_start = (frame->height * jobnr) / nb_jobs;const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;ChromakeyContext *ctx = avctx->priv;int x, y, xo, yo;uint8_t u[9], v[9];memset(u, ctx->chromakey_uv[0], sizeof(u));memset(v, ctx->chromakey_uv[1], sizeof(v));for (y = slice_start; y < slice_end; ++y) {for (x = 0; x < frame->width; ++x) {for (yo = 0; yo < 3; ++yo) {for (xo = 0; xo < 3; ++xo) {get_pixel_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);}}frame->data[3][frame->linesize[3] * y + x] = do_chromakey_pixel(ctx, u, v);}}return 0;
}

2.ffmpeg滤镜colorkey针对rgb处理,将目标像素点设置为透明。

static uint8_t do_colorkey_pixel(ColorkeyContext *ctx, uint8_t r, uint8_t g, uint8_t b)
{int dr = (int)r - ctx->colorkey_rgba[0];int dg = (int)g - ctx->colorkey_rgba[1];int db = (int)b - ctx->colorkey_rgba[2];//计算相似度double diff = sqrt((dr * dr + dg * dg + db * db) / (255.0 * 255.0 * 3.0));if (ctx->blend > 0.0001) {return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * 255.0;} else {return (diff > ctx->similarity) ? 255 : 0;}
}
static int do_colorkey_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
{AVFrame *frame = arg;const int slice_start = (frame->height * jobnr) / nb_jobs;const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;ColorkeyContext *ctx = avctx->priv;int o, x, y;for (y = slice_start; y < slice_end; ++y) {for (x = 0; x < frame->width; ++x) {o = frame->linesize[0] * y + x * 4;// 修改rgba a数据frame->data[0][o + ctx->co[3]] =do_colorkey_pixel(ctx,frame->data[0][o + ctx->co[0]],frame->data[0][o + ctx->co[1]],frame->data[0][o + ctx->co[2]]);}}return 0;
}

参考:
http://ffmpeg.org/ffmpeg-filters.html#colorkey
ffmpeg绿幕抠图原理解析

ffmpeg是音视频必备,但即使从业数年,它似乎依然有无穷的秘密,感兴趣添加笔者微信:YQW1163720468,加入ffmpeg微信群讨论。但记得备注:ffmpeg爱好者

ffmpeg -i 20190323162628578.png -i juren-30s.mp4 -filter_complex “[0:v]colorkey=0x00FF00:0.1:0[out];[1:v][out]overlay[re]” -map [re] -c:v h264_qsv re.mp4

转成yuv就会花屏
ffmpeg -i 20190323162628578.png  -vf  "colorkey=0x00FF00:0.5:0"      -pix_fmt yuv420p t.yuv
ffplay -video_size 146x60 -pixel_format yuv420p -i t.yuv
这样OK
ffmpeg -i 20190323162628578.png  -vf  "colorkey=0x00FF00:0.5:0"     t.png
ffplay t.png
这样OK
ffmpeg -i 20190323162628578.png  -vf  "colorkey=0x00FF00:0.5:0"      -pix_fmt yuva420p t.yuv
ffplay -video_size 146x60 -pixel_format yuva420p -i t.yuv
palettegen滤镜也可以设置透明度
ffmpeg -i "./了不起\3D%02d.png" -filter_complex "[0:v]scale=700:700:force_original_aspect_ratio=decrease,format=rgba,fps=25,split[v0][v1];[v0]palettegen=reserve_transparent=on:transparency_color=00000000[v];[v1][v]paletteuse" -y 了不起.gif

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

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

相关文章

Centos7原生hadoop环境,搭建Impala集群和负载均衡配置

Centos7原生hadoop环境&#xff0c;搭建Impala集群和负载均衡配置 impala介绍 Impala集群包含一个Catalog Server (Catalogd)、一个Statestore Server (Statestored) 和若干个Impala Daemon (Impalad)。Catalogd主要负责元数据的获取和DDL的执行&#xff0c;Statestored主要负…

VSCode远程连接服务器报错:Could not establish connection to

参考&#xff1a;https://blog.csdn.net/weixin_42538848/article/details/118113262 https://www.jb51.net/article/219138.htm 刚开始把ssh文件夹中的known_hosts给删除了&#xff0c;发现没啥用。 之后在扩展Remote-SSH里面&#xff0c;把config file路径设置为ssh文件夹里…

洛谷刷题入门篇:分支结构

今天又来了&#xff0c;刷题刷题&#xff0c;我爱刷题&#xff0c;题单链接如下&#xff1a; https://www.luogu.com.cn/training/101#problems 一、【深基1-2】小学数学 N 合一 题目如下&#xff1a;https://www.luogu.com.cn/problem/P2433 题目描述 问题 1 请输出 I lov…

【03】FISCOBCOS配置及使用控制台

官网文档https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html# 配置及使用控制台 第一步. 准备依赖 安装java &#xff08;推荐使用java 14&#xff09; # ubuntu系统安装java sudo apt install -y default-jdk#centos系统安装java sudo yu…

uni-app实现获取未来七天时间和星期几功能

例子如下&#xff1a; HTML&#xff1a; <viewstyle"margin-top: 3%;width: 100%;height: 10vh;display: flex;justify-content: space-around;"><div v-for"(item,index) in same_week" :class"[same_dayitem.date? activ :,dis]"cl…

关于CS 4.7 Stager 逆向及 Shellcode 重写

1. 概述 一直很想有一个自己的控&#xff0c;奈何实力不允许&#xff0c;CS 仍然是目前市面上最好用的控&#xff0c;但是也被各大厂商盯得很紧&#xff0c;通过加载器的方式进行免杀效果有限&#xff0c;后来看到有人用 go 重写了 CS 的 beacon&#xff0c;感觉这个思路很好&…

LVS-NAT模式

LVS负载均衡群集 群集的定义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用 对于企业服务的的性能提升一般…

测试网页调用本地可执行程序(续:带参数调用)

前篇文章介绍了网页调用本地可执行程序的方式&#xff0c;通过在注册表中注册命令&#xff0c;然后在网页中调用命令启动本地程序。如果需要传递参数&#xff0c;则需要在注册表命令中的command项中设置如下形式的值。 "XXXXXX\XXXXXXX.exe" "%1"&emsp…

【python】Seaborn画热力图,只显示第一行数字---seaborn与matplotlib版本问题

github上有这个讨论&#xff1a;Heatmap only has annotation text in the top row only Issue #3478 mwaskom/seaborn (github.com)翻译过来就是&#xff1a;热图仅在最上面一行有注释文本&#xff1b; 原因就是matplotlib 在2023年9月更新到了 3.8.0版本&#xff0c;改变了…

FPGA project : HCSR04

犯下的错误&#xff1a; 1&#xff0c;由于使用cnt_base 做echo回响信号高电平时间的测量&#xff0c;它的数据应该很大&#xff0c;位宽也很大。也可以采用cnt_us计数器&#xff0c;计算这个高电平时间的。我为了精确计算距离&#xff0c;所以才仍然用的cnt_base计数器。 2&…

什么算泄露公司机密的行为(什么程度算公司泄密行为)

在当今的商业环境中&#xff0c;保护公司的核心竞争力和商业机密是至关重要的。然而&#xff0c;员工可能出于各种原因泄露这些信息&#xff0c;包括对竞争对手的追求、个人利益的驱动或者对工作的不满。在这种情况下&#xff0c;企业需要依赖专业的调查工具来揭示和证明员工的…

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…

Vue路由及Node.js环境搭建

目录 一、Vue路由 1.1 定义 1.2 应用领域 1.3 代码展示 二、Node.js 2.1 定义 2.2 特点 2.3 Node.js安装与配置 2.3.1 下载安装包 2.3.2 手动新建文件夹 2.3.3 注意事项 2.3.4 配置环境变量 2.3.5 检验是否安装配置成功 2.3.6 设置淘宝源 2.3.7 查看全局路径设置…

通用返回结果类ResultVO

1. 定义通用返回结果类 ​ 定义ResultVO类&#xff0c;作返回给前端的对象结构&#xff0c;主要有4个字段 code : 错误码 data : 内容message : 消息description : 具体描述 import lombok.Data; import java.io.Serializable;/*** 通用返回结果类* param <T>*/ Data …

史上最详细的测试用例写作规范

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

论文研读-数据共享-大数据流分析中的共享执行技术

Shared Execution Techniques for Business Data Analytics over Big Data Streams 大数据流分析中的共享执行技术 1、摘要 2020年的一篇共享工作的论文&#xff1a;商业数据分析需要处理大量数据流&#xff0c;并创建物化视图以便给用户实时提供分析结果。物化每个查询&#x…

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm&#xff0c;生成了桌面图标并信任&#xff0c;可以新建文件&#xff0c;但是软件无法打开。在终端执行如下命令&#xff0c;用命令行启动wps&#xff1a; cd /opt/kingsoft/wps-office/office6/ ./…

Learn Prompt- Midjourney 图片生成:基本设置和预设

/settings指令为模型版本、样式值、质量值和升级器版本等常用选项提供切换按钮。 备注 添加到提示末尾的参数将覆盖/settings中的设置。 模型版本​ 1️⃣ MJ Version 12️⃣ MJ Version 23️⃣ MJ Version 34️⃣ MJ Version 45️⃣ MJ Version 5&#x1f308; Niji Mode&a…

zerotier-client

title: “zerotier-client” createTime: 2022-10-10T11:50:5108:00 updateTime: 2022-10-10T11:50:5108:00 draft: false author: “zcb” tags: [“zerotier-plant”,“zerotier-client”,“zerotier”] categories: [“zerotier”] description: “测试的” 1.windows 1.1…