OpenCV cv2.putText实现字符串换行'\n'

本文介绍了一种在OpenCV中实现字符串换行显示的方法,通过自定义函数draw_text_line(),利用cv2.putText进行多行文本绘制。文章提供了详细的代码实现,包括如何计算字符宽度和调整文本位置,以实现自动换行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV cv2.putText实现字符串换行'\n'

OpenCV显示字符串时,可以调用cv2.putText直接进行显示方法,但该函数是不支持换行符"\n"的

要想实现自动换行,需要自己编程计算字符宽度,下移动宽度等操作

这里提供自己实现draw_text_line()函数,可以直接支持换行符的显示

代码实现:

# -*-coding: utf-8 -*-
"""
    @Project: Demo
    @Author : panjq
    @E-mail : pan_jinquan@163.com
    @Date   : 2019-12-11 19:43:34
"""
import cv2


def draw_text(img, point, text, drawType="custom"):
    '''
    :param img:
    :param point:
    :param text:
    :param drawType: custom or custom
    :return:
    '''
    fontScale = 0.4
    thickness = 5
    text_thickness = 1
    bg_color = (255, 0, 0)
    fontFace = cv2.FONT_HERSHEY_SIMPLEX
    # fontFace=cv2.FONT_HERSHEY_SIMPLEX
    if drawType == "custom":
        text_size, baseline = cv2.getTextSize(str(text), fontFace, fontScale, thickness)
        text_loc = (point[0], point[1] + text_size[1])
        cv2.rectangle(img, (text_loc[0] - 2 // 2, text_loc[1] - 2 - baseline),
                      (text_loc[0] + text_size[0], text_loc[1] + text_size[1]), bg_color, -1)
        # draw score value
        cv2.putText(img, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale,
                    (255, 255, 255), text_thickness, 8)
    elif drawType == "simple":
        cv2.putText(img, '%d' % (text), point, fontFace, 0.5, (255, 0, 0))
    return img


def draw_text_line(img, point, text_line: str, drawType="custom"):
    '''
    :param img:
    :param point:
    :param text:
    :param drawType: custom or custom
    :return:
    '''
    fontScale = 0.4
    thickness = 5
    fontFace = cv2.FONT_HERSHEY_SIMPLEX
    # fontFace=cv2.FONT_HERSHEY_SIMPLEX
    text_line = text_line.split("\n")
    # text_size, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
    text_size, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
    for i, text in enumerate(text_line):
        if text:
            draw_point = [point[0], point[1] + (text_size[1] + 2 + baseline) * i]
            img = draw_text(img, draw_point, text, drawType)
    return img


if __name__ == "__main__":
    import copy
    image_path = "./data/test/test01.jpg"
    image = cv2.imread(image_path)
    point = (10, 10)
    text_line = "AAAA\nBBBB\nCCCC\n"
    image1 = draw_text(copy.copy(image), point, text_line, drawType="custom")
    cv2.imshow("draw_text", image1)
    image2 = draw_text_line(copy.copy(image), point, text_line)
    cv2.imshow("draw_text_line", image2)
    cv2.waitKey(0)
    cv2.waitKey(0)

 

### 解决 Python OpenCV `cv2.putText` 函数显示中文乱码的方法 当使用 OpenCV 的 `cv2.putText()` 方法尝试绘制中文字符时,可能会遇到乱码问题。这是因为默认情况下,OpenCV 并不支持 UTF-8 编码的字符串以及复杂的字体渲染。 一种有效的解决方案是利用 Pillow 库来处理文字绘制部分,再将其转换回 OpenCV 图像格式。具体实现如下: #### 使用 Pillow 和 NumPy 处理中文文本 通过引入 Pillow 来创建带有指定中文字体的文字图片,并最终转成适合 OpenCV 显示的形式[^1]。 ```python from PIL import Image, ImageDraw, ImageFont import numpy as np import cv2 def put_chinese_text(image_path, text, position=(50, 50)): # 加载原始图像并准备画布 img_bgr = cv2.imread(image_path) # 将 BGR 色彩模式转化为 RGB 方便后续操作 img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 构建PIL.Image对象用于绘图 pil_image = Image.fromarray(img_rgb) draw = ImageDraw.Draw(pil_image) # 设置字体样式与大小 font_style = ImageFont.truetype("simhei.ttf", 40, encoding="utf-8") # 在图像上写入汉字 draw.text(position, text, fill=(255, 0, 0), font=font_style) # 把修改过的图像重新转化回numpy数组形式供opencv读取 final_img_np_array = np.array(pil_image) # 返回至BGR色彩空间以便于保存或展示 result_img = cv2.cvtColor(final_img_np_array, cv2.COLOR_RGB2BGR) return result_img if __name__ == "__main__": output = put_chinese_text('example.jpg', '你好世界') cv2.imshow('Result with Chinese Text', output) cv2.waitKey(0) ``` 此方法绕过了 OpenCV 对复杂字体的支持不足的问题,借助第三方库实现了高质量的中文文本渲染效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI吃大瓜

尊重原创,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值