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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:15:08