游客您好
第三方账号登陆
Lv.9 管理员
1366号会员,2042活跃度,2018/12/07 加入学习
  • 176发帖
  • 161主题
  • 2关注
  • 5粉丝
这个人很懒,什么也没有留下。
最新推荐更多

[综合技巧] 关于百度OCR截图识字 代码存档

[复制链接]
风起云甬 发表于 2020-12-20 11:13:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
  1. import tkinter
  2. # import asyncio
  3. from PIL import ImageGrab
  4. from aip import AipOcr
  5. import time
  6. import os
  7. import http.client
  8. import hashlib
  9. import json
  10. import urllib
  11. import random
  12. from tkinter import ttk


  13. # def get_from_lang(self):
  14. #     print(self.from_lang.get())
  15. #     # return
  16. #
  17. #
  18. # def get_to_lang(self):
  19. #     print(self.to_lang.get())
  20. #     # return


  21. class MyCapture:

  22.     def __init__(self):
  23.         # 变量X和Y用来记录鼠标左键按下的位置
  24.         self.X = tkinter.IntVar(value=0)
  25.         self.Y = tkinter.IntVar(value=0)
  26.         self.sel = False
  27.         self.ocr_text = None
  28.         self.capture_png_path = ''
  29.         self.capture_text_box = tkinter.Text(window)  # 创建text容器用于存放截图识别的文字
  30.         self.capture_text_box.place(x=10, y=40, anchor='nw', width=366+60, height=366)

  31.         self.capture_btn = tkinter.Button(text='截图', command=self.capture_cmd)  # 创建一个按钮
  32.         self.capture_btn.place(x=10, y=10, anchor='nw', width=60, height=26)  # 在创建的窗口的西北角x=20,y=10处放置按钮

  33.         self.label_1 = tkinter.Label(text='点击截图,然后按住鼠标左键选取范围,松开即可识别所选区域')
  34.         self.label_1.place(x=76,y=10)
  35.         #self.label_1.pack(side='top')


  36.         # 屏幕尺寸
  37.         self.screenWidth = window.winfo_screenwidth()
  38.         self.screenHeight = window.winfo_screenheight()
  39.         self.temp_png = 'temp.png'
  40.         # self.create_canvas()

  41.     def create_canvas(self):
  42.         time.sleep(0.2)
  43.         im = ImageGrab.grab()
  44.         im.save(self.temp_png)
  45.         im.close()
  46.         # 创建顶级组件容器
  47.         self.top = tkinter.Toplevel(window, width=self.screenWidth, height=self.screenHeight)
  48.         # 不显示最大化、最小化按钮
  49.         self.top.overrideredirect(True)
  50.         self.canvas = tkinter.Canvas(self.top, bg='white', width=self.screenWidth, height=self.screenHeight)
  51.         # 显示全屏截图,在全屏截图上进行区域截图
  52.         self.image = tkinter.PhotoImage(file=self.temp_png)
  53.         self.canvas.create_image(self.screenWidth // 2, self.screenHeight // 2, image=self.image)

  54.         # 鼠标左键按下的位置
  55.         self.canvas.bind('<Button-1>', self.mouse_left_down)
  56.         # 鼠标左键移动,显示选取的区域
  57.         self.canvas.bind('<B1-Motion>', self.mouse_move)
  58.         # 获取鼠标左键抬起的位置,保存区域截图
  59.         self.canvas.bind('<ButtonRelease-1>', self.mouse_left_up)

  60.         self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)

  61.     def mouse_left_down(self, event):
  62.         """鼠标左键按下的位置"""
  63.         self.X.set(event.x)
  64.         self.Y.set(event.y)
  65.         self.sel = True  # 开始截图

  66.     # 鼠标左键移动,显示选取的区域
  67.     def mouse_move(self, event):
  68.         if not self.sel:
  69.             return
  70.         try:
  71.             # 删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
  72.             self.canvas.delete(self.lastDraw)
  73.         except Exception as e:
  74.             pass
  75.         self.lastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='red')

  76.     def mouse_left_up(self, event):
  77.         """获取鼠标左键抬起的位置,保存区域截图"""
  78.         self.sel = False
  79.         try:
  80.             self.canvas.delete(self.lastDraw)
  81.         except Exception as e:
  82.             pass
  83.         # 考虑鼠标左键从右下方按下而从左上方抬起的截图
  84.         x1, x2 = sorted([self.X.get(), event.x])  # tkinter记录的坐标点
  85.         y1, y2 = sorted([self.Y.get(), event.y])

  86.         pic = ImageGrab.grab((x1 + 1, y1 + 1, x2, y2))
  87.         # pic.show()
  88.         self.capture_png_path = 'capture_png.png'
  89.         pic.save(self.capture_png_path)

  90.         # 关闭当前窗口
  91.         self.top.destroy()

  92.     def capture_cmd(self):
  93.         """点击截图按钮触发函数"""
  94.         window.iconify()  # 窗口最小化
  95.         # 显示全屏幕截图
  96.         self.create_canvas()
  97.         self.capture_btn.wait_window(self.top)
  98.         os.remove(self.temp_png)
  99.         self.ocr_text = self.baidu_ocr(self.capture_png_path)
  100.         print(self.ocr_text)
  101.         if self.ocr_text:
  102.             self.capture_text_box.delete('1.0', tkinter.END)  # 清空文本框
  103.             #self.translate_text_box.delete('1.0', tkinter.END)
  104.             self.capture_text_box.insert('end', self.ocr_text)
  105.             window.deiconify()  # 窗口显示
  106.             os.remove(self.capture_png_path)

  107.     def baidu_ocr(self, file_path):
  108.         """ 调用通用文字识别, 图片参数为本地图片 """
  109.         app_id = '22939066'
  110.         api_key = 'axVPGC3eid6ZTkbsVAo9xjGO'
  111.         secret_key = 'kdySkPheRA7jAtCBGMCYTvMoRmIbmBG2'
  112.         ocr_text = ''
  113.         if os.path.isfile(file_path):
  114.             with open(file_path, 'rb') as fp:
  115.                 image = fp.read()
  116.             ocr_ret = AipOcr(app_id, api_key, secret_key).basicGeneral(image)
  117.             words = ocr_ret.get('words_result')
  118.             if words is not None and len(words):
  119.                 for word in words:
  120.                     # print(word['words'], end='\n')
  121.                     ocr_text += word['words'] + '\n'
  122.                 return ocr_text
  123.             else:
  124.                 return None
  125.         else:
  126.             return None

  127.     def baidu_translate(self, content):
  128.         app_id = '22939066'
  129.         secret_key = 'kdySkPheRA7jAtCBGMCYTvMoRmIbmBG2'
  130.         http_client = None
  131.         myurl = '/api/trans/vip/translate'
  132.         q = content
  133.         # from_lang = 'zh'  # 源语言
  134.         from_lang = self.from_lang  # 源语言
  135.         to_lang = self.to_lang  # 翻译后的语言
  136.         # to_lang = 'en'  # 翻译后的语言
  137.         salt = random.randint(32768, 65536)
  138.         sign = app_id + q + str(salt) + secret_key
  139.         sign = hashlib.md5(sign.encode()).hexdigest()
  140.         myurl = myurl + '?appid=' + app_id + '&q=' + urllib.parse.quote(
  141.             q) + '&from=' + from_lang + '&to=' + to_lang + '&salt=' + str(
  142.             salt) + '&sign=' + sign

  143.         try:
  144.             http_client = http.client.HTTPConnection('api.fanyi.baidu.com')
  145.             http_client.request('GET', myurl)
  146.             # response是HTTPResponse对象
  147.             response = http_client.getresponse()
  148.             json_response = response.read().decode("utf-8")  # 获得返回的结果,结果为json格式
  149.             js = json.loads(json_response)  # 将json格式的结果转换字典结构
  150.             # print(js)
  151.             dst = str(js["trans_result"][0]["dst"])  # 取得翻译后的文本结果
  152.             # print(dst)  # 打印结果
  153.             return dst
  154.         except Exception as e:
  155.             print(e)
  156.             return None
  157.         finally:
  158.             if http_client:
  159.                 http_client.close()

  160.     def get_from_lang(self, event):
  161.         # print(self.from_lang_box.get())
  162.         self.from_lang = self.lang_dic[self.from_lang_box.get()]
  163.         # return

  164.     def get_to_lang(self, event):
  165.         # print(self.to_lang_box.get())
  166.         self.to_lang = self.lang_dic[self.to_lang_box.get()]
  167.         # return


  168. window = tkinter.Tk()
  169. window.title('截图识字-Python')
  170. # 创建tkinter主窗口
  171. window.geometry('432x420')  # 指定主窗口位置与大小
  172. window.minsize(366+86,420)
  173. capture = MyCapture()
  174. # capture.from_lang.bind("<<ComboboxSelected>>", get_from_lang(capture))
  175. # capture.to_lang.bind("<<ComboboxSelected>>", get_to_lang(capture))
  176. window.mainloop()
复制代码
关于百度OCR截图识字 代码存档,慧之家



• 本内容来源互联网,如涉及版权问题请及时联系站长
• 为防止代码解析,除代码框内<>为正常,其余请重新替换<>尖括号

发布资源 快速回复 站点服务大厅 搜索 官方群