最简单的是使用滤镜

# 查看滤镜帮助
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] 绘制矩形框相关推荐

  1. python PyQt5如何绘制矩形框?(画框/绘框)

    参考代码: from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt f ...

  2. opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...

  3. OpenCV中鼠标交互-绘制矩形框

    OpenCV中鼠标交互-绘制矩形框 ·具体流程: 1.绑定回调函数 2.在回调函数中检测触发的事件 3.根据不同事件做出不同动作 一.绑定回调函数 cv2.setMouseCallback('orig ...

  4. svg 读取SVG文件并绘制矩形框选择图元

    首先是SVG文件,里面包含了几个不同的图元: <?xml version='1.0' standalone='no'?> <!DOCTYPE svg PUBLIC "-// ...

  5. 利用cv2.rectangle()绘制矩形框(python)

    文章目录 cv2.rectangle绘制矩形框 使用解析 范例 总结 cv2.addWeighted绘制半透明框 使用解析 范例 总结 使用cv2.rectangle可以绘制矩形框,但要绘制半透明框使 ...

  6. Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

  7. pyqt5在图像上绘制矩形框

    pyqt5在图像上绘制矩形框 from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QR ...

  8. CAD绘制矩形框命令

    该功能制可以绘制矩形,并能按指定值绘制倒角和圆角.该功能绘制出的矩形是封闭的单一实体. 1.单击菜单栏,"绘图->矩形框. 2.单击绘图工具栏"绘矩形框命令"按钮. ...

  9. 车灯检测并绘制矩形框

    // Starfeatures_detector2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostrea ...

最新文章

  1. 安装NFS服务,并挂载到开发板
  2. 考前自学系列·计算机组成原理·微程序微指令微命令微操作
  3. 细数网络上十七种安全威胁
  4. window.onscroll
  5. C#实现 Linq 序列的Distinct—— IEnumerable.Distinct()——IEqualityComparer
  6. Cypress自动化测试系列之三
  7. Scala:输入输出
  8. mac连接Linux工具推荐,mac最值得关注的终端工具,你知道几个?
  9. 福禄克光纤OTDR测试与光损耗测试的区别分析
  10. android 远程调试工具,Android 远程调试工具STF——开源项目
  11. html语言 搜索引擎关键词 怎么写,HTML关键词
  12. Ken Thompson的话
  13. 我的数学学习回忆录——一个数学爱好者的反思(二)
  14. 《使用Python进行自然语言处理》学习笔记四
  15. 微信对接会员管理系统搭建体系
  16. 使用 Python 进行面部特征检测和面部过滤器
  17. Win10 WSL2 linux 子系统安装Docker
  18. Python 取代了 Excel 在银行业务中的地位?
  19. Long与long的区别
  20. 前端练习--网易新闻

热门文章

  1. linux文件恢复dbf,linux平台下数据文件被误删后,如何及时得知并进行恢复-dbf文件怎么打开...
  2. 大学物理实验电学基本参数的测量实验报告_思你所想 | 那些年,我们做过的实验...
  3. mysql如何通过数据库修改root_MySQL数据库之MySQL——修改root密码的4种方法(以windows为例)...
  4. 力扣 496 下一个更大的元素I
  5. 【机器学习-西瓜书】二、性能度量:召回率;P-R曲线;F1值;ROC;AUC
  6. Android studio 去除软件运行时顶部原有的蓝色/绿色框
  7. 分拆素数和【筛选法】
  8. 深度学习——最优化的学习笔记
  9. 如何在gitee上部署网页
  10. R语言正则表达式[stringr package]