如何用OpenCV在图片上画汉字

问题描述 投票:0回答:1

目前我的项目使用OpenCV来处理图片,绘制一些信息然后通过ffmpeg将视频帧推送出去,因为是直播流形式的推送,单帧的处理速度很高,处理速度慢,它会导致推出视频流丢帧。排除故障后,比较耗时的过程就是绘制汉字的过程。因为OpenCV不支持绘制汉字,所以我每次绘制的时候都使用Pillow来转换图像格式,绘制完之后再将Pillow图像转换回numpy格式。以下是绘制汉字的关键代码步骤:

cv2_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(cv2_img)
draw = ImageDraw.Draw(pil_img)
font = ImageFont.truetype("simhei.ttf", 15, encoding="utf-8")
delta_y = 20
draw.text((x, y + delta_y), f"中文xxxxx", (255, 255, 255), font=font)
img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)

以下解决方案已知有效:

  1. 所有绘图均使用Pillow完成(包括绘制矩形框、线段等)
  2. 编译包含 freetype 模块的 OpenCV 包。编译包含 freetype 模块的 OpenCV 包。 对于我提出的两种解决方案,由于一些复杂的原因,可能不太好处理:
  3. 代码中的绘图是交叉绘图,OpenCV -> Pillow -> Opencv ……如果专门用 Pillow 来绘图,变化量会更大。
  4. 我正在用freetype模块编译OpenCV-python,但是即使编译成功,也会遇到一些跨平台移植、跨版本使用等一系列问题,只能通过重新编译来解决,程序为仅用作备份程序 该程序当前仅用作替代解决方案。

当然还有其他的解决方案,如果有满足我高处理速度要求的程序,欢迎大哥给予参考。

python opencv python-imaging-library
1个回答
0
投票

你的问题有几个方面我无法弄清楚,所以这里有一些一般性的想法:

  • 如果性能是一个问题,你必须分析你的代码,这样你就不会浪费时间优化错误的部分
  • 如果您只注释一两个角,则不一定需要将整个视频帧转换为
    PIL.Image
    ,您可能会自行传递它们
  • 如果您选择在纯黑色背景上进行注释,则不一定需要将任何 OpenCV 帧传递给 PIL
  • 您不必为每一帧创建一个新的
    PIL.Image
    - 您可以在视频开头创建一个,然后在每一帧的开头用黑色填充它,然后在其上绘制文本 - 您不需要然后为每个帧创建一个新的绘图上下文
  • 你不需要转换BGR->RGB->BGR,你可以只用BGR颜色指定你的PIL绘图
  • 您可以在视频开始时获取字体一次,而不是每一帧
© www.soinside.com 2019 - 2024. All rights reserved.