目录

使用到的工具

使用步骤

公式识别接口申请

公式识别示例代码

实现截图示例代码

最终代码与效果


同类的工具有:妙手OCR、Mathpix等。有些收费,有些不好用,这里自己随便实现一个。

(个人比较喜欢妙手OCR,不限次数又好用,虽然偶尔识别不准)

使用到的工具

讯飞公式识别API:个人开发者每天500次免费额度,一般够用了。

PrScrn.dll:旧版微信的截图dll(新版微信已更改)。

相关库:pyperclip、PIL、ctypes、re、os、time、requests、datetime、hashlib、base64、hmac、json

使用步骤

公式识别接口申请

1、先去讯飞申请免费接口

公式识别 - 图像识别 - 讯飞开放平台 (xfyun.cn)https://www.xfyun.cn/service/formula-discern申请完记下密钥

接口文档:

公式识别 API 文档 | 讯飞开放平台文档中心 (xfyun.cn)https://www.xfyun.cn/doc/words/formula-discern/API.html

公式识别示例代码

使用示例代码测试,注意先把上面的密钥填入

api的示例代码formulaRecognition.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-# 1.接口文档(必看):https://www.xfyun.cn/doc/words/formula-discern/API.html
# 2.错误码链接:https://www.xfyun.cn/document/error-code (错误码code为5位数字)
#import requests
import datetime
import hashlib
import base64
import hmac
import jsonclass FormulaRecognition(object):def __init__(self):# 应用ID(到控制台获取)self.APPID = ""# 接口APISercet(到控制台公式识别服务页面获取)self.Secret = ""# 接口APIKey(到控制台公式识别服务页面获取)self.APIKey = ""# 以下为POST请求self.Host = "rest-api.xfyun.cn"self.RequestUri = "/v2/itr"# 设置url# print(host)self.url = "https://" + self.Host + self.RequestUriself.HttpMethod = "POST"self.Algorithm = "hmac-sha256"self.HttpProto = "HTTP/1.1"# 设置当前时间curTime_utc = datetime.datetime.utcnow()self.Date = self.httpdate(curTime_utc)self.BusinessArgs = {"ent": "teach-photo-print","aue": "raw",}def imgRead(self, path):with open(path, 'rb') as fo:return fo.read()def hashlib_256(self, res):m = hashlib.sha256(bytes(res.encode(encoding='utf-8'))).digest()result = "SHA-256=" + base64.b64encode(m).decode(encoding='utf-8')return resultdef httpdate(self, dt):"""Return a string representation of a date according to RFC 1123(HTTP/1.1).The supplied date must be in UTC."""weekday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()]month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep","Oct", "Nov", "Dec"][dt.month - 1]return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (weekday, dt.day, month,dt.year, dt.hour, dt.minute, dt.second)def generateSignature(self, digest):signatureStr = "host: " + self.Host + "\n"signatureStr += "date: " + self.Date + "\n"signatureStr += self.HttpMethod + " " + self.RequestUri \+ " " + self.HttpProto + "\n"signatureStr += "digest: " + digestsignature = hmac.new(bytes(self.Secret.encode(encoding='utf-8')),bytes(signatureStr.encode(encoding='utf-8')),digestmod=hashlib.sha256).digest()result = base64.b64encode(signature)return result.decode(encoding='utf-8')def init_header(self, data):digest = self.hashlib_256(data)# print(digest)sign = self.generateSignature(digest)authHeader = 'api_key="%s", algorithm="%s", ' \'headers="host date request-line digest", ' \'signature="%s"' \% (self.APIKey, self.Algorithm, sign)# print(authHeader)headers = {"Content-Type": "application/json","Accept": "application/json","Method": "POST","Host": self.Host,"Date": self.Date,"Digest": digest,"Authorization": authHeader}return headersdef get_body(self, image_path):audioData = self.imgRead(image_path)content = base64.b64encode(audioData).decode(encoding='utf-8')postdata = {"common": {"app_id": self.APPID},"business": self.BusinessArgs,"data": {"image": content,}}body = json.dumps(postdata)# print(body)return bodydef call_url(self, image_path):if self.APPID == '' or self.APIKey == '' or self.Secret == '':print('Appid 或APIKey 或APISecret 为空!请打开demo代码,填写相关信息。')else:code = 0body = self.get_body(image_path)headers = self.init_header(body)# print(self.url)response = requests.post(self.url, data=body, headers=headers, timeout=8)status_code = response.status_code# print(response.content)if status_code != 200:# 鉴权失败print("Http请求失败,状态码:" + str(status_code) + ",错误信息:" + response.text)print("请根据错误信息检查代码,接口文档:https://www.xfyun.cn/doc/words/formula-discern/API.html")else:# 鉴权成功respData = json.loads(response.text)# print(respData)# 以下仅用于调试code = str(respData["code"])if code != '0':print("请前往https://www.xfyun.cn/document/error-code?code=" + code + "查询解决办法")return response.json()if __name__ == '__main__':gClass = FormulaRecognition()gClass.call_url('01.png')

测试图片:

实现截图示例代码

先导入库

import re
import time
import pyperclip
from PIL import Image, ImageGrab
import os
from formulaRecognition import FormulaRecognition
import ctypes

截图功能可以简单地直接使用“旧版的QQ、微信的dll”来实现,相比之下,微信的dll更好用点。Python中可以使用ctypes来调用dll,但可能会遇到一些问题,详见:

Python调用动态链接库DLL文件_小锋学长生活大爆炸的博客-CSDN博客简单用用dllhttps://xfxuezhang.blog.csdn.net/article/details/124223015由于本机python为64位,dll为32位,因此这里使用rundll32来实现,如下:

os.system('RUNDLL32.EXE PrScrn.dll PrScrn')

为了在截图时候隐藏当前的窗口,可以使用如下方式:

window_handle = ctypes.windll.kernel32.GetConsoleWindow()
# 0:隐藏;6:最小化
# 1:显示;3:最大化
ctypes.windll.user32.ShowWindow(window_handle, 0)
time.sleep(0.5)
os.system('RUNDLL32.EXE PrScrn.dll PrScrn')
ctypes.windll.user32.ShowWindow(window_handle, 1)

微信dll截图后的图片存放在剪切板,因此需要从剪切板上读取后,再使用讯飞API来识别,由于pyperclip只支持文字,因此对于图片类的,需要使用PIL库。如下:

img = ImageGrab.grabclipboard()
if not isinstance(img, Image.Image):return
print('>> 识别中...')
image_path = "formula_recognition_temp.png"
img.save(image_path)
recognition = FormulaRecognition()
res = recognition.call_url(image_path)
os.remove(image_path)
if res['code'] != 0:return
content = res['data']['region'][0]['recog']['content']
content = re.sub(r'ifly-latex-begin', '', content)
content = re.sub(r'ifly-latex-end', '', content)
# 将结果复制到剪切板
pyperclip.copy(content)
print(content)

最终代码与效果

import re
import time
import pyperclip
from PIL import Image, ImageGrab
import os
from formulaRecognition import FormulaRecognition
import ctypesdef start():window_handle = ctypes.windll.kernel32.GetConsoleWindow()# 0:隐藏;6:最小化# 1:显示;3:最大化ctypes.windll.user32.ShowWindow(window_handle, 0)time.sleep(0.5)os.system('RUNDLL32.EXE PrScrn.dll PrScrn')ctypes.windll.user32.ShowWindow(window_handle, 1)img = ImageGrab.grabclipboard()if not isinstance(img, Image.Image):returnprint('>> 识别中...')image_path = "formula_recognition_temp.png"img.save(image_path)recognition = FormulaRecognition()res = recognition.call_url(image_path)os.remove(image_path)if res['code'] != 0:returncontent = res['data']['region'][0]['recog']['content']content = re.sub(r'ifly-latex-begin', '', content)content = re.sub(r'ifly-latex-end', '', content)# 将结果复制到剪切板pyperclip.copy(content)print(content)if __name__ == '__main__':while True:if input('>> 按回车启动,按q退出: ').strip().lower() == 'q':breakprint('>> 启动中...')try:start()except Exception as e:print(e)

运行中:

识别结果:

\frac {c}{a}    \sin   A=  \frac {bc}{a^ {2}}    \sin ^ {2}  A=  \frac {20}{21}    \times     \frac {3}{4}  =  \frac {5}{7}

放入markdown看下效果:

自己实现Latex公式识别相关推荐

  1. 拖拽公式图片、一键转换LaTex公式,开源公式识别神器

    来源:机器之心 只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式. 写论文.做研究时,最让你头疼的是什么?想必公式编辑会榜上有名.那么有没有便捷的方法进行公式编辑呢?这里推荐一款神器 ...

  2. python识别latex公式_Python代码转Latex公式,这个开源库用一行代码帮你搞定

    来源:机器之心 数学是数据科学和机器学习的重要基础,数学运算的结果对于机器学习项目而言是至关重要的.在编写代码时,我们常常需要定义数学公式的计算形式.像 S=r^2 这样简单的数学公式,大概不会出现拼 ...

  3. latex 数学公式_数学公式、方程式 OCR 识别编辑 LaTeX 公式软件神器—极度公式

    极度公式:化繁为简,助您高效工作 极度公式是一款强大的跨平台专业 Latex 公式软件.支持公式字符编辑与录入.公式模板选择,对于重要公式支持云备份.也可以手机端(安卓)拍照桌面端编辑(Windows ...

  4. 图片转换为 latex 公式,识别图片中Latex公式,支持数学公式,化学公式,物理公式和生物公式,附Java代码和测试效果

    目  录 1.编写Java代码实现识别图片中Latex公式 2.测试结果 ​3.源码下载 1.编写Java代码实现识别图片中Latex公式 直接上代码: public static String se ...

  5. 推荐一款latex公式OCR识别软件

    推荐一款latex公式OCR识别软件 最近有这个需求,于是去找了一下,最后发现一个好用的软件,在这里推荐一下. 优点 识别率高,个人亲测,非常准确,截图就随便放一个: 步骤 先点击这个链接注册账号(这 ...

  6. Mathpix---截图识别LaTeX公式

    嫌LaTeX太麻烦怎么办?看看Mathpix就会有答案. 目录 一.下载 二.使用方法 (1)设置 (2)截图识别 (3)复制代码至Typora 三.建议 一.下载 [软件下载链接] Mathpix ...

  7. 拖拽公式图片、一键转换LaTex公式,这款开源公式识别神器比Mathpix Snip更适合你...

    视学算法报道 机器之心编辑部 只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式. 写论文.做研究时,最让你头疼的是什么?想必公式编辑会榜上有名.那么有没有便捷的方法进行公式编辑呢?这 ...

  8. 强大!一键转换LaTex公式,这款开源公式识别神器比Mathpix Snip更适合你

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 机器之心报道 只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式. 写 ...

  9. latex 公式不居中_LaTex小技巧,祝你论文一臂之力!

    LaTex作为常用的排版系统,已深入到大家的工作和学业中.但是很多小伙伴反馈说:LaTex公式编辑复杂.表格处理麻烦等.为此,我们特别收集了一些LaTex的小技巧,希望大家都可以get到! 公式篇 首 ...

最新文章

  1. linux 软链接_Linux 中软链接和硬链接的区别 | Linux 中国
  2. 【集训第四天·继续刷题】之 lgh怒刚ypj
  3. Ubuntu 20.04 E:无法找到软件包python-pip 安装python2.7
  4. vb.net2019-打开外部程序发送键盘信号(4)
  5. 数据结构和算法之稀疏数组
  6. 《炉石传说》架构设计赏析(3):Gameplay初探
  7. linux字符设备移动硬盘,Red Hat Enterprise Linux 7.5挂载NTFS移动硬盘
  8. Android开发之NDK下载与NDK更新
  9. .net core 多版本如何选择
  10. 【渝粤教育】电大中专学前儿童语言教育 (6)作业 题库
  11. java中sql之count_按SQL Server中的count()子句分组
  12. 用 cctld工具创建带有国家代码的IP地址表
  13. python记录(5)- find() 与 rfind()
  14. (一)MySQL 基础配置
  15. Eclipse Maven编译报不支持muti-catch
  16. 使用go语言开发一个后端gin框架的web项目
  17. Deeping Learning学习与感悟——《深度学习工程师》_3
  18. U3D中ShaderForge插件使用系列教程之一
  19. 在mysql中更新数据sql语句怎么写_在MySQL中,更新数据库表记录的SQL语句,包括______语句...
  20. Excel公式与函数——每天学一个

热门文章

  1. python实现数据结构--线性表
  2. 慎用鲁大师 360等软件
  3. uni-app的使用分享(一)
  4. java十进制转换成二进制
  5. 双十一购买什么最划算,最值得入手的几款数码好物推荐
  6. 2048游戏配色方案的计算(小清新版)
  7. Linux 用ssh远程登录及scp传输文件
  8. 电脑如何修改关闭显示器和休眠时间
  9. 分解质因数 (10 分)
  10. CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录