上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

【opencv练习】青果课程表文字提取(三)

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-18 11:32
  • 签到天数: 194 天

    [LV.7]常住居民III

    723

    主题

    6097

    回帖

    6874

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6874

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-12-10 06:32:36 | 显示全部楼层 | 阅读模式

    最后简单根据x,y做一些数据整理
    这里我为了图方便直接约10

    data = {}
    
    def insert_lesson_data(x, y, text):
        pos = int(int(x / 10) * 10)
        if pos not in data:
            data[pos] = []
        data[pos].append((y, text))

    打印之前记得排序一下

    for x in sorted(data.keys()):
        print(f"{x}:")
        data[x].sort(key=lambda item: item[0])
        for y, text in data[x]:
            print(f"x: {x} y: {y}, text: {text}")

    效果图
    image.png
    完整代码

    import logging
    import cv2
    import numpy as np
    from paddleocr import PaddleOCR
    
    logging.disable(logging.DEBUG)
    data = {}
    def insert_lesson_data(x, y, text):
        pos = int(int(x / 10) * 10)
        if pos not in data:
            data[pos] = []
        data[pos].append((y, text))
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    originImage = cv2.imread("test.png")
    image = cv2.cvtColor(originImage, cv2.COLOR_BGR2GRAY)
    denoised_image = cv2.fastNlMeansDenoising(image, None, 30, 7, 21)
    ret, thresh = cv2.threshold(denoised_image, 220, 255, cv2.THRESH_TRUNC)
    _, binary = cv2.threshold(thresh, 128, 255, cv2.THRESH_BINARY_INV)
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
    # cv2.drawContours(originImage, contours, -1, (0,0, 255), 2) 画全部
    for i in range(len(contours)):
        area = cv2.contourArea(contours[i])
        x, y, w, h = cv2.boundingRect(contours[i])
        if area > 500 and w >= 100 and w <= 888:
            top_left = (x, y)
            bottom_right = (x + w, y + h)
            roi = thresh[y : y + h, x : x + w]
            result = ocr.ocr(roi, cls=False)
            text = ""
            for line in result:
                if line is not None:
                    for word_info in line:
                        text += word_info[1][0]
            cv2.rectangle(originImage, top_left, bottom_right, (0, 0, 255), 2)
            insert_lesson_data(x, y, text)
    
    for x in sorted(data.keys()):
        print(f"{x}:")
        data[x].sort(key=lambda item: item[0])
        for y, text in data[x]:
            print(f"x: {x} y: {y}, text: {text}")
    cv2.imshow("originImage", originImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    慵懒
    19 小时前
  • 签到天数: 842 天

    [LV.10]以坛为家III

    31

    主题

    555

    回帖

    1581

    积分

    荣誉开发者

    积分
    1581

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2024-12-11 06:58:03 | 显示全部楼层
    看了下PaddleOCR没有Node版本吗
    之前Node的试过Tesseract、dddd感觉都不太行识别率不是很高

    另外哥哥会的好多啊Py都会,爱了
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-18 11:32
  • 签到天数: 194 天

    [LV.7]常住居民III

    723

    主题

    6097

    回帖

    6874

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6874

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-12-11 16:04:33 | 显示全部楼层
    steven026 发表于 2024-12-11 06:58
    看了下PaddleOCR没有Node版本吗
    之前Node的试过Tesseract、dddd感觉都不太行识别率不是很高

    我也不知道,大不了继续express裹一层QAQ

    不是应该羡慕我学了CV吗!

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表