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.hqwc.cn/news/115496.html

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

相关文章

2023版 STM32实战3 按键外部中断(电路与代码都讲解)

常规电路(带上拉电阻) 阻值可选3.3/4.7/5.1/10 单位K 偷懒电路 利用GPIO内部的上拉模式 代码&#xff08;直接拷贝使用&#xff09; 这是一个外部中断控制变量a增加减少的demo 为了新手方便我直接都写在了main.c文件 #include "stm32f10x.h"u8 keyflag0; u8 a0…

鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决

目录 问题解决思路解决代码&#xff08;标注【主要代码】的为重点&#xff09; 问题 拖动该悬浮球时&#xff0c;鼠标弹起可能会触发悬浮球内事件 解决思路 鼠标拖动盒子时&#xff0c;将 isMove 设为 true 意为正在拖动盒子&#xff0c;此时将 class"btns_move" 遮…

采用cv2和默认的人脸识别分类器实现人脸检测功能

人脸识别分类器 haarcascade_frontalface_default 提示&#xff1a;分类器文件地址在这里&#xff1a;https://github.com/opencv/opencv/blob/687fc11626901cff09d2b3b5f331fd59190ad4c7/data/haarcascades/haarcascade_frontalface_default.xml 文章目录 人脸识别分类器 haar…

终于把量化入门了,实盘权限已开,学习这件事也不难

多数人18岁就死了&#xff0c;但直到75岁才埋。 ——网易云热评《杀死那个石家庄人》 猫猫挺喜欢这句话的&#xff0c;为什么只活动75岁&#xff0c;于是我查了查现如今78.6岁&#xff0c;大差不差的。 那扣扣减减&#xff0c;人生短短57年&#xff0c;唯一十八岁那年&#xff…

C# 查找迷宫路径

1.导入图像&#xff0c;并且将图像转灰度 using var img new Image<Bgr, byte>(_path); using var grayImg img.Convert<Gray, byte>(); 2.自动二值化图像 using var inputGrayOut new Image<Gray, byte>(grayImg.Size); // 计算OTSU阈值 var threshol…

[正确重装docker] Win10 重装 Docker 提示 Exising installation is up to date 的正确姿势

Win10 重装 Docker 报错 Exising installation is up to date 的一种情况是原来的 docker 没有卸载干净&#xff0c;或者说&#xff0c;没有正确卸载。 巧了&#xff0c;我就是直接删除了&#xff0c;因为一些原因重装了好几次&#xff0c;血泪史留给各位嘲笑。 一条正确的卸…

怎么将几张图片做成pdf合在一起

怎么将几张图片做成pdf合在一起&#xff1f;在我们平时的工作中&#xff0c;图片和pdf都是非常重要的电脑文件&#xff0c;使用也非常频繁&#xff0c;图片能够更为直观的展示内容&#xff0c;而pdf则更加的正规&#xff0c;很多重要文件大多会做成pdf格式的。在职场人的日常工…

力扣刷题-数组-螺旋矩阵

模拟过程&#xff0c;但却十分考察对代码的掌控能力。 重点&#xff1a;循环不变量原则&#xff01; 第一条原则&#xff1a; 模拟顺时针画矩阵的过程&#xff1a; 填充上行从左到右填充右列从上到下填充下行从右到左填充左列从下到上 由外向内一圈一圈这么画下去。 第二条原…

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好&#xff0c;我是沙漠尽头的狼。 本方首发于Dotnet9&#xff0c;介绍使用dnSpy调试第三方.NET库源码&#xff0c;行文目录&#xff1a; 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具&#xff0c;…

ESP8266 WiFi物联网智能插座—电能计量

目录 1、芯片功能 2、性能指标 3、寄存器说明 4、UART通信协议 4.1、写操作帧格式和时序 4.2、读操作帧格式和时序 4.3、读取全电参数数据包 4.4、配置波特率 4.5、UART保护机制 5、功能说明 5.1、电流电压瞬态波形计量 5.2、有功功率 5.3、有功功率防潜动 5.4、电能计量 5.5、…

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟&#xff0c;现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能&#xff1a;快速读取所有位数据、寄存器数据的当前数值。 操作&#xff1a;双击“数值”列表头。 一键…

基于微信小程序的公司后勤服务(设备)系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明员工微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#x…