You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV中将ASCII文本写入图像时出现异常图形而非英文字母的问题求助

OpenCV中将ASCII文本写入图像时出现异常图形而非英文字母的问题求助

嘿,我完全懂你现在的头疼点——把转好的ASCII文本再写成图像,结果出来的是奇怪形状不是预期的英文字母,确实挺闹心的!你怀疑是字体问题,这个方向没毛病,但咱们得从代码细节里揪出具体原因,我帮你梳理几个关键问题和修复方案:

可能的问题点与对应修复建议

  • 字体缩放与间距不匹配
    你现在在cv2.putText里用了font_size/2作为字体缩放因子,但初始定义的font_size=14,这意味着实际绘制的字体大小只有7,却用14像素的间距来移动字符,不仅会让字符间距过大,还可能因为绘制区域的错位导致字符变形。
    建议统一用getTextSize获取真实的字符尺寸来计算间距:

    scale = 1  # 保持字体缩放为1,避免尺寸混乱
    # 获取单个英文字符的真实宽度
    char_width, _ = cv2.getTextSize("A", font, scale, 1)[0]
    # 用真实字符宽度控制横向移动距离
    x += char_width
    
  • 换行逻辑有缺陷
    当前的换行逻辑只简单让y += font_size,但字体的实际高度包含基线等部分,用固定的font_size会导致行间距不足,字符重叠或者被截断。建议用字符的真实高度来计算行间距:

    _, char_height = cv2.getTextSize("A", font, scale, 1)[0]
    line_spacing = 2  # 可调整的行间距
    # 换行时重置x,y增加字符高度+行间距
    if x + char_width >= width:
        x = 0
        y += char_height + line_spacing
    
  • 文本读取的编码隐患
    如果你的ASCII文本文件不是UTF-8编码,读取时可能会出现隐形乱码,导致绘制出奇怪图形。建议打开文件时指定编码:

    with open(file_path, 'r', encoding='utf-8') as file:
        text = file.read()
    
  • 字体兼容性问题
    cv2.FONT_HERSHEY_SIMPLEX是基础字体,某些环境下对部分ASCII字符的支持可能不够稳定,你可以试试换用其他内置字体:

    font = cv2.FONT_HERSHEY_PLAIN  # 更简洁的无衬线字体
    # 或者
    font = cv2.FONT_HERSHEY_DUPLEX
    

调整后的完整代码示例

import numpy as np
import cv2

def saveTxtAsPicture(file_path, width, height, currentframe):
    """
    converts txt file to picture then saves it
    :param file_path: txt file to convert
    :param width: image width
    :param height: image height
    :param currentframe: frame number for filename
    :return: the filtered ascii image
    """
    # 以UTF-8编码读取文本,避免乱码
    with open(file_path, 'r', encoding='utf-8') as file:
        text = file.read()

    # 定义字体、缩放比例和线条粗细
    font = cv2.FONT_HERSHEY_SIMPLEX
    scale = 1
    thickness = 1

    # 获取单个字符的尺寸,用于排版计算
    char_width, char_height = cv2.getTextSize("A", font, scale, thickness)[0]
    line_spacing = 2  # 自定义行间距,可根据需求调整

    # 创建白色背景图像
    img = np.zeros((int(height), int(width), 3), dtype=np.uint8)
    img.fill(255)

    x = 0
    y = char_height  # 初始y值设为字符高度,避免顶部字符被截断

    for char in text:
        # 处理文本中的换行符
        if char == '\n':
            x = 0
            y += char_height + line_spacing
            continue
        # 检查当前字符是否超出图像宽度
        if x + char_width >= width:
            x = 0
            y += char_height + line_spacing
        # 绘制单个字符
        cv2.putText(img, char, (x, y), font, scale, (0, 0, 0), thickness, cv2.LINE_AA)
        x += char_width
        # 如果超出图像高度则停止绘制
        if y + char_height >= height:
            break

    # 保存图像
    cv2.imwrite(f'./txtFilesPic/text_image{currentframe}.jpg', img)

你可以先试试这些调整,尤其是字体缩放和换行逻辑的部分,应该能解决大部分奇怪图形的问题。如果还是有异常,建议检查下你的ASCII文本文件里是否存在隐藏的非打印字符,这也可能导致绘制出奇怪形状。

备注:内容来源于stack exchange,提问作者MR. potato35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:14:33