目录

使用到的工具

使用步骤

公式识别接口申请

公式识别示例代码

实现截图示例代码

最终代码与效果


同类的工具有:妙手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. python库——h5py入门讲解
  2. C语言实现hash/xor8算法(附完整源码)
  3. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
  4. Java读取properties配置文件时,中文乱码解决方法
  5. 网优5g前景_网优行业的吐槽,附吐槽记录
  6. HTML5项目实战之旅行社网站——PC端固定布局
  7. 现代操作系统的基本特性(2)
  8. 十个最常用深度学习图像/视频数据标注工具
  9. 20考研率辉计算机复试(二分法)
  10. qnx 设备驱动开发_移植LINUX的外围设备驱动到QNX系统中
  11. 真人玩计算机图片大全集,微信真人表情图片大全 用自己的照片做微信真人表情包(好玩),各类搞笑素材任你选择...
  12. 量化投资中常用python代码分析(一)
  13. 2021年中国乳制品产量、营业收入、利润总额及进出口分析[图]
  14. Shell脚本之免交互
  15. java 无法找到ant_命令行Ant无法识别
  16. QT实现浏览器访问网页,使用QWebEngineView
  17. gpu服务器厂家_高人气的最近的GPU服务器
  18. 【系统分析师之路】2017年系统分析师上午综合知识历年真题
  19. Microsoft Lync server 2013 企业即时通讯软件
  20. Windows 7关闭睡眠(休眠)模式和删除休眠文件

热门文章

  1. 金斧子银斧子和铁斧子
  2. 乐高大颗粒作品之西游记
  3. 批量缩小多张图片尺寸,保持图片清晰无损
  4. python 登录新浪微博_Python 模拟登录新浪微博
  5. 要来了!国内安卓统一推送标准将于 今年3 月开启测试
  6. 浅谈二叉查找树、AVL树、红黑树、B树、B+树的原理及应用
  7. 101 Ruby Code Factoids
  8. 屏幕录制组件(vue) recordrtc
  9. 数一数你连听都没听过的古典小说有多少?
  10. 【软件测试】离开“浪浪山“测试人迎来的春天......