OCR识别数学公式图片,获得原始公式代码

场景

撰写算法类报告时,需要引用一些数学公式,直接截图太难看

解决方法

1、注册并下载mathpix

网址:Mathpix Snip Notes

2、打开软件并登陆

3、点击识别按钮,并选择需要识别的内容

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学公式识别是一个比较复杂的任务,需要结合多个算法和库来完成。以下是一个基本的Java代码框架,可以作为参考: ```java import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.core.Rect; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import ij.ImagePlus; import ij.process.ImageProcessor; import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; public class MathOCR { // 图像二值化阈值 private static final int THRESHOLD = 120; // 字符宽度和高度的最小值和最大值 private static final int MIN_WIDTH = 5; private static final int MAX_WIDTH = 300; private static final int MIN_HEIGHT = 5; private static final int MAX_HEIGHT = 300; // 字符识别器 private static ITesseract tesseract = new Tesseract(); static { // 设置Tesseract的语言 tesseract.setLanguage("eng"); } public static void main(String[] args) { // 加载OpenCV库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取输入图像 String imagePath = "input.png"; Mat image = Imgcodecs.imread(imagePath); // 预处理图像 Mat gray = new Mat(); Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY); Imgproc.threshold(gray, gray, THRESHOLD, 255, Imgproc.THRESH_BINARY_INV); Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); Imgproc.erode(gray, gray, kernel); Imgproc.dilate(gray, gray, kernel); // 字符分割 List<Rect> charRects = new ArrayList<>(); Mat hierarchy = new Mat(); List<MatOfPoint> contours = new ArrayList<>(); Imgproc.findContours(gray, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); for (int i = 0; i < contours.size(); i++) { Rect rect = Imgproc.boundingRect(contours.get(i)); if (rect.width > MIN_WIDTH && rect.width < MAX_WIDTH && rect.height > MIN_HEIGHT && rect.height < MAX_HEIGHT) { charRects.add(rect); } } // 对每个字符进行识别 StringBuilder sb = new StringBuilder(); for (Rect charRect : charRects) { Mat charImage = gray.submat(charRect); BufferedImage bufferedImage = MatToBufferedImage(charImage); String result = recognizeCharacter(bufferedImage); sb.append(result); } // 输出识别结果 System.out.println(sb.toString()); } // 将OpenCV的Mat对象转换为Java的BufferedImage对象 private static BufferedImage MatToBufferedImage(Mat matrix) { MatOfByte mob = new MatOfByte(); Imgcodecs.imencode(".png", matrix, mob); byte[] byteArray = mob.toArray(); BufferedImage image = null; try { image = javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(byteArray)); } catch (Exception e) { e.printStackTrace(); } return image; } // 对单个字符进行识别 private static String recognizeCharacter(BufferedImage image) { String result = ""; try { result = tesseract.doOCR(image); } catch (TesseractException e) { e.printStackTrace(); } return result.trim(); } } ``` 这个代码框架包含了图像预处理、字符分割和字符识别等步骤,但是仅作为示例,可能需要根据具体的场景进行调整和优化。另外,需要注意的是,这个代码框架依赖于OpenCV和Tesseract两个库,需要在项目中添加这两个库的引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值