2025-08-19利用opencv检测图片中文字及图片的坐标

同时还 计算出坐标及字体大小

bash 复制代码
from cnocr import CnOcr
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

# 初始化 cnocr
ocr = CnOcr()


def put_chinese_text(image, text, position, font_size=20, color=(0, 255, 0)):
    """
    在图像上绘制中文文本
    """
    # 将OpenCV的BGR图像转换为RGB图像
    image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    # 设置字体,需要系统中有支持中文的字体
    try:
        # Windows系统常用字体
        font = ImageFont.truetype("simhei.ttf", font_size)
    except:
        try:
            # 尝试其他常见中文字体
            font = ImageFont.truetype("arial.ttf", font_size)
        except:
            # 如果找不到特定字体,使用默认字体
            font = ImageFont.load_default()

    # 创建绘图对象
    draw = ImageDraw.Draw(image_pil)

    # 绘制文本
    draw.text(position, text, font=font, fill=color)

    # 转换回OpenCV格式
    image_cv = cv2.cvtColor(np.asarray(image_pil), cv2.COLOR_RGB2BGR)

    return image_cv


def detect_text_positions(image_path):
    """检测图片中的文字位置"""
    # 加载图片
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 使用 cnocr 检测文字
    results = ocr.ocr(gray)  # 使用 ocr.ocr 而不是 ocr.ocr_for_single_line

    # 保存文字框
    text_positions = []
    for result in results:
        text = result['text']
        bbox = result['position']
        x_min, y_min = bbox[0]
        x_max, y_max = bbox[2]
        x, y, w, h = int(x_min), int(y_min), int(x_max - x_min), int(y_max - y_min)

        # 计算文字的像素宽度和高度
        pixel_width = w
        pixel_height = h

        text_positions.append({
            "text": text,
            "bbox": (x, y, w, h),
            "pixel_width": pixel_width,
            "pixel_height": pixel_height
        })

        # 在图片上绘制文字框
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 使用支持中文的函数绘制文本
        image = put_chinese_text(image, text, (x, y - 20), font_size=15, color=(0, 255, 0))

    return image, text_positions


def main(image_path):
    """主函数:检测文字位置"""
    # 检测文字
    text_image, text_positions = detect_text_positions(image_path)

    # 显示结果
    cv2.imshow("Detected Text", text_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 打印文字位置及尺寸信息
    print("文字位置:")
    for text_pos in text_positions:
        print(f"文本: {text_pos['text']}, 坐标: {text_pos['bbox']}, "
              f"像素宽度: {text_pos['pixel_width']}, 像素高度: {text_pos['pixel_height']}")

    return {"text_positions": text_positions}


if __name__ == "__main__":
    image_path = "6.png"  # 替换为你的图片路径
    results = main(image_path)
相关推荐
火山引擎开发者社区3 小时前
Agent Plan、Coding Plan限时优惠:2.5折畅享多模型!
人工智能
冬奇Lab4 小时前
AI Workflow 定义的四次演进:从 Markdown 到 JS 脚本,再到分布式多 Agent
javascript·人工智能·agent
冬奇Lab4 小时前
每日一个开源项目(第136篇):OpenMemory - 给 AI Agent 真正的认知记忆引擎
人工智能
黄啊码5 小时前
【黄啊码】微信 AI 把聊天功能和 Vibe Coding打通了,创业者:我又白干了
人工智能
IT_陈寒5 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
用户413062258296 小时前
给AI回答加引用角标citation:RAG前端实现
人工智能
米小虾7 小时前
WAIC 2026 倒计时30天:300+ AI 产品全球首发,今年看点全解析
人工智能
码上天下7 小时前
多模态Agent上传图片:前端压缩格式与预览实战
人工智能