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
相关产品推荐
相关产品推荐

