[FFmpeg] 绘制矩形框
最简单的是使用滤镜
# 查看滤镜帮助
ffplay -h filter=drawbox
# 单个矩形
ffplay -i fpx.gif -vf drawbox:x=10:y=10:w=50:h=50:c=red
# 多个矩形,中间使用逗号连接
ffplay -i fpx.gif -vf drawbox:x=10:y=10:w=50:h=50:c=red,\drawbox:x=100:y=10:w=50:h=50:c=rgb(0,0,255)
现在由 YOLO 算法检测出每帧图片中物体的位置(s-x,s-y,s->w,s->h),需要在 ffplay 源码中嵌入绘制矩形框的函数。首先要参考 ffmpeg-4.3.1/libavfilter/vf_drawbox.c。
图像:
核心代码(仅对 YUV 格式有效):
for (y = FFMAX(yb, 0); y < FFMIN(yb + s->h, frame->height); y++) {row[0] = frame->data[0] + y * frame->linesize[0];for (plane = 1; plane < 3; plane++)row[plane] = frame->data[plane] +frame->linesize[plane] * (y >> s->vsub);for (x = FFMAX(xb, 0); x < FFMIN(xb + s->w, frame->width); x++) {if (pixel_belongs_to_box(s, x, y)) {row[0][x ] = s->yuv_color[Y];row[1][x >> s->hsub] = s->yuv_color[U];row[2][x >> s->hsub] = s->yuv_color[V];}}
}
其原理很简单,两个 for 循环遍历矩形的每一个像素点,通过 pixel_belongs_to_box() 函数判断该点是否在矩形框内,如果在,就修改该点的颜色。pixel_belongs_to_box() 函数如下,s->thickness 表示矩形框的厚度。
static int pixel_belongs_to_box(DrawBoxContext *s, int x, int y)
{return (y - s->y < s->thickness) || (s->y + s->h - 1 - y < s->thickness) ||(x - s->x < s->thickness) || (s->x + s->w - 1 - x < s->thickness);
}
在上面的核心代码中,还出现了 s->hsub 和 s->vsub,这是色度二次采样值,和像素格式有关,获取方式如下,pix_fmt 即为帧的像素格式。
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
s->hsub = desc->log2_chroma_w;
s->vsub = desc->log2_chroma_h;
====================================================================
缺点是扫描整个矩形导致速度太慢,毕竟我们只是绘制矩形框而非整个矩形,所以做出改进:
for (y = FFMAX(yb, 0); y < FFMIN(yb + s->h, frame->height); y++) {row[0] = frame->data[0] + y * frame->linesize[0];for (plane = 1; plane < 3; plane++)row[plane] = frame->data[plane] +frame->linesize[plane] * (y >> s->vsub);if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness)) {for (x = FFMAX(xb, 0); x < FFMIN(xb + s->w, frame->width); x++) {row[0][x ] = s->dst_color[Y];row[1][x >> s->hsub] = s->dst_color[U];row[2][x >> s->hsub] = s->dst_color[V];}} else {for (x = FFMAX(xb, 0); x < xb + s->thickness; x++) {row[0][x ] = s->dst_color[Y];row[1][x >> s->hsub] = s->dst_color[U];row[2][x >> s->hsub] = s->dst_color[V];}for (x = xb + s->w - s->thickness; x < FFMIN(xb + s->w, frame->width); x++) {row[0][x ] = s->dst_color[Y];row[1][x >> s->hsub] = s->dst_color[U];row[2][x >> s->hsub] = s->dst_color[V];}}
}
原理同样是自上而下扫描,但通过对 y 坐标的判断,跳过了矩形框中间的空白部分,速度大大加快!
[FFmpeg] 绘制矩形框相关推荐
- python PyQt5如何绘制矩形框?(画框/绘框)
参考代码: from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt f ...
- opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框
基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...
- OpenCV中鼠标交互-绘制矩形框
OpenCV中鼠标交互-绘制矩形框 ·具体流程: 1.绑定回调函数 2.在回调函数中检测触发的事件 3.根据不同事件做出不同动作 一.绑定回调函数 cv2.setMouseCallback('orig ...
- svg 读取SVG文件并绘制矩形框选择图元
首先是SVG文件,里面包含了几个不同的图元: <?xml version='1.0' standalone='no'?> <!DOCTYPE svg PUBLIC "-// ...
- 利用cv2.rectangle()绘制矩形框(python)
文章目录 cv2.rectangle绘制矩形框 使用解析 范例 总结 cv2.addWeighted绘制半透明框 使用解析 范例 总结 使用cv2.rectangle可以绘制矩形框,但要绘制半透明框使 ...
- Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框
模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...
- pyqt5在图像上绘制矩形框
pyqt5在图像上绘制矩形框 from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QR ...
- CAD绘制矩形框命令
该功能制可以绘制矩形,并能按指定值绘制倒角和圆角.该功能绘制出的矩形是封闭的单一实体. 1.单击菜单栏,"绘图->矩形框. 2.单击绘图工具栏"绘矩形框命令"按钮. ...
- 车灯检测并绘制矩形框
// Starfeatures_detector2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostrea ...
最新文章
- 安装NFS服务,并挂载到开发板
- 考前自学系列·计算机组成原理·微程序微指令微命令微操作
- 细数网络上十七种安全威胁
- window.onscroll
- C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer
- Cypress自动化测试系列之三
- Scala:输入输出
- mac连接Linux工具推荐,mac最值得关注的终端工具,你知道几个?
- 福禄克光纤OTDR测试与光损耗测试的区别分析
- android 远程调试工具,Android 远程调试工具STF——开源项目
- html语言 搜索引擎关键词 怎么写,HTML关键词
- Ken Thompson的话
- 我的数学学习回忆录——一个数学爱好者的反思(二)
- 《使用Python进行自然语言处理》学习笔记四
- 微信对接会员管理系统搭建体系
- 使用 Python 进行面部特征检测和面部过滤器
- Win10 WSL2 linux 子系统安装Docker
- Python 取代了 Excel 在银行业务中的地位?
- Long与long的区别
- 前端练习--网易新闻
热门文章
- linux文件恢复dbf,linux平台下数据文件被误删后,如何及时得知并进行恢复-dbf文件怎么打开...
- 大学物理实验电学基本参数的测量实验报告_思你所想 | 那些年,我们做过的实验...
- mysql如何通过数据库修改root_MySQL数据库之MySQL——修改root密码的4种方法(以windows为例)...
- 力扣 496 下一个更大的元素I
- 【机器学习-西瓜书】二、性能度量:召回率;P-R曲线;F1值;ROC;AUC
- Android studio 去除软件运行时顶部原有的蓝色/绿色框
- 分拆素数和【筛选法】
- 深度学习——最优化的学习笔记
- 如何在gitee上部署网页
- R语言正则表达式[stringr package]