如何使用Python在图像上垂直打印文本 解决OpenCV旋转图像文字显示问题
解决方案
OpenCV 默认读取图像时不会解析Exif方向元数据,你当前手动旋转图像后直接调用cv2.putText生成的文字默认是水平方向,无法直接输出垂直排列的文本,提供两种可行实现方案:
方案1:先修正Exif方向,再按正常逻辑标注
从根源解决方向不匹配的问题,无需额外处理文字旋转,是优先推荐的方案:
- 用
pillow库读取图像自动修正Exif方向,再转成OpenCV格式的图像做后续处理,代码示例:
import cv2 import json import numpy as np from PIL import Image, ImageOps # 第一步:读取图像并自动修正Exif方向 img_pil = Image.open('dummy.jpg') # 该方法会自动根据Exif参数调整图像方向,返回方向正常的PIL图像 img_pil = ImageOps.exif_transpose(img_pil) # 转成OpenCV兼容的BGR格式 img = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) img1 = img.copy() # 后续标注逻辑无需改动,因为图像方向已经正常,文字自然是符合阅读习惯的方向 rects = [] with open('dummy.json') as jsn: jsn_dict = json.load(jsn) for k in jsn_dict['textAnnotations']: vertices= k['boundingPoly']['vertices'] cv2.rectangle(img1,list(vertices[2].values()),list(vertices[0].values()),[0,255,0],10) cv2.putText(img1, k['description'], list(vertices[0].values()),cv2.FONT_HERSHEY_SIMPLEX,5,[0,255,0],5)
该方案适合OCR标注的坐标本身就是基于修正后图像生成的场景,原有标注逻辑几乎不需要修改。
方案2:生成旋转文字后贴到原图
如果你确定要保留当前旋转后的图像,需要直接输出垂直排列的文字,可以通过「透明画布绘制文字→旋转画布→合并到原图」的逻辑实现:
import numpy as np def put_text_vertical(img, text, pos, font, font_scale, color, thickness, rotate_direction=cv2.ROTATE_90_COUNTERCLOCKWISE): # 计算文字尺寸,创建对应大小的带透明通道的画布 (text_w, text_h), _ = cv2.getTextSize(text, font, font_scale, thickness) text_canvas = np.zeros((text_h + 10, text_w + 10, 4), dtype=np.uint8) # 在画布上先绘制水平文字 cv2.putText(text_canvas, text, (5, text_h + 5), font, font_scale, (*color, 255), thickness) # 旋转画布得到垂直文字 text_rotated = cv2.rotate(text_canvas, rotate_direction) # 处理坐标边界,避免文字溢出图像 h, w = text_rotated.shape[:2] x, y = pos w = min(w, img.shape[1] - x) h = min(h, img.shape[0] - y) # 基于透明通道合并文字和原图 alpha = text_rotated[:h, :w, 3] / 255.0 for c in range(3): img[y:y+h, x:x+w, c] = (1 - alpha) * img[y:y+h, x:x+w, c] + alpha * text_rotated[:h, :w, c] return img # 原有逻辑中调用cv2.putText的地方替换为该函数即可 put_text_vertical(img1, k['description'], list(vertices[0].values()), cv2.FONT_HERSHEY_SIMPLEX,5,[0,255,0],5)
如果需要调整文字旋转方向,修改rotate_direction参数为cv2.ROTATE_90_CLOCKWISE即可。
内容的提问来源于stack exchange,提问作者Muhammad Awais
相关产品推荐
相关产品推荐

