为什么不自动从视频中通过图片文字识别的方式来获取这些数据?

个人需求

当SpaceX发射猎鹰9号时,第一、二火箭的实时速度和高度信息会出现在屏幕的左下角和右下角,屏幕下方仍然是时间:

前几天发了一篇关于猎鹰9号惊人的40秒的文章,里面引用了很多猎鹰9号一级火箭在Transport-3任务中从点火到着陆的实时速度和高度。,美中不足的是速度和高度数据,我每10秒看一次视频,手动输入Excel,这种事情做一次还行,但做第二次就受不了了!和!如果我想压缩时间间隔,输入量会成倍增长,这对于程序员来说是无法接受的!

所以我想玩一些高端的程序包是什么意思,为什么不通过图文识别自动从视频中获取这些数据呢?我的想法很简单,三步:

这样,SpaceX每次发射猎鹰9号,下载视频后,就可以自动获取任务中一级火箭和二级火箭的实时速度和高度数据,进一步加深影响在猎鹰 9 号上。知道这个数字绝对有帮助!

技术选型

我是一名 Java 程序员。为了快速满足我的个人需求,我搜索了支持Java的开源库。开源库需要实现两个功能。一是能够对单帧视频进行抓拍和裁剪,二是能够识别图片上的文字。幸运的是,这两个要求由来已久。视频抓帧裁剪选用开源OpenCV,图片文字识别选用开源Tesseract。

由于苹果的M1系列芯片刚刚发布两年,虽然很多开源函数库通过JNA封装支持Java调用,但是大部分都是在X86平台上,所以如果要使用基于Arm架构的M1系列芯片,最好使用它们。或者通过源码再用Arm指令编译一下,正好借此机会了解一下高深莫测的C系统编译打包。

我不得不在这里抱怨一点。像这种开源的图片类别基础库,大多是用C或C++编写的,我在网上找的只能用国外的。

正方体简介

Tesseract 是一个开源的光学字符识别 (OCR) 引擎。据说识别准确率位居前三。光学字符识别,简而言之,基于训练模型从数码图片中识别出各种语言的字符,支持世界主流语言。.

据悉,Tesseract 在 Windows 和 Ubuntu 系统上都经过了严格的测试,整体表现不错。

OpenCV 简介

OpenCV可以一句话概括为一套跨平台的计算机视觉基础库,适用领域广泛,包括但不限于:情绪估计、面部识别、手势识别、人机交互、运动跟踪、物体检测、立体视觉、增强现实等,当然就个人而言,我可能只会使用它提供的 2D 或 3D 基本视觉工具包。

此外,OpenCV拥有强大的合作伙伴阵容,包括英特尔、微软、华为等科技巨头:

在商业使用方面,OpenCV 给了开发者一颗定心丸——免费:

整体来看,OpenCV是一个很好的深耕方向,我个人打算把它当作一个高优先级的兴趣。也许OpenCV可以为我提供一份稳定的工作。

预安装:自制

具体 HomeBrew 做了什么,我们来看一张官方的图:

如红框所示,HomeBrew 是一个适用于 macOS 或 Linux 系统的包管理器。安装非常简单。官方还给出了下载运行的命令合二为一:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

注意:如果在下载过程中443端口拒绝连接,网上有两种解决方法。一种是找到域名对应的IP地址,通过给hosts添加映射来解决。另一种是让终端使用http代理。.

安装成功后,在终端输入brew可以正确给出如下信息程序包是什么意思,表示安装成功:

安装 HomeBrew 是为了通过它安装 OpenCV 和 Tesseract 的各种依赖项。

编译和安装 Tesseract

虽然Tesseract在Maven仓库中有Java JNA包Tess4J,但是在Pom文件中直接引用这个Jar包是不能正常使用的:

原因是我个人的理解是,Tess4J只是一个JNA封装器,也就是Java中的一个接口,其定义方法的具体实现取决于本地适配运行平台的运行库。,在Windows平台下,大部分以.dll的形式存在。在 MacOS 中,它是 .dylib 的后缀。在我本地编译和安装 Tesseract 之前,您可能希望查看运行错误消息:

未找到/usr/lib/liblept.5.dylib。

首先从GitHub下载Tesseract最新源码,一个小压缩包:

然后通过 HomeBrew 安装 Tesseract 的依赖包。依赖列表如下:

# 必备依赖brew install automake autoconf libtoolbrew install pkgconfigbrew install icu4cbrew install leptonica# 训练工具brew install pango# 扩展特性brew install libarchive# g++编译依赖brew install gcc

安装时建议先开启代理,设置代理使用终端。比如我会在我的配置下的终端上输入,这样对下载速度会有很大的影响。最重要的是,如果遇到A tainted domain name,proxy可以正确规避:

export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

另外,在使用brew安装包的时候,最好将每个包单独安装,也就是使用

brew install xxx

而不是采用

brew install xxx yyy zzz

这样,至少哪个安装成功,哪个安装失败,你心里就会有一个数字。另外,软件包安装失败,大部分情况是网络原因造成的,问题不大,多试几次就好了。就以上9个依赖包而言,我安装大概需要一个小时左右。依赖包安装成功后,接下来就是进入编译阶段了。

具体如何编译以及依次执行哪些命令,Tesseract官网给出了具体说明。macOS下基于HomeBrew的编译命令,官方指导为:

cd tesseract./autogen.shmkdir build && cd build../configure PKG_CONFIG_PATH=/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfigmake -jsudo make installmake trainingsudo make training-install

第一行进入刚刚下载的Tesseract的源码文件夹,第二行是先执行一个脚本,不看做什么,第三四行是在源码文件夹中创建一个build文件夹,用于编译工作,然后在构建文件夹中执行后续命令。

第六行,这里我们需要调整一下,把下面三个依赖包的路径调整为通过HomeBrew安装的路径,

icu4c,libarchive,libffi

那么 HomeBrew 安装的这三个包在哪里呢?一般情况下是在HomeBrew文件夹中,所以调整第六行命令后应该是:

PKG_CONFIG_PATH=/opt/homebrew/opt/icu4c/lib/pkgconfig:/opt/homebrew/opt/libarchive/lib/pkgconfig:/opt/homebrew/opt/libffi/lib/pkgconfig

这里有一点需要注意。官方编译文档中还有一句话,说在M1芯片系列下,可能需要另外指定一个配置项:

../configure CXX="g++ --target=arm-apple-darwin64"

很明显,这个配置项的意思是专门为MacOS的Arm平台编译的,但是我实际执行这个命令的时候,这个命令并不能成功执行。我选择暂时跳过,继续执行以下命令。经过实际验证,在macOS 12.1中,当Tesseract的源码版本为5.01时,即使该命令执行不成功,也不影响后续的编译、安装和调用。

剩下的四个命令是编译和安装 Tesseract 和训练好的模型数据。总体来说,Tesseract5.01在M1 Pro下执行上述编译安装命令,耗时10分钟左右。您需要查看是否正确生成了 Tesseract 的基础库。上一篇文章提到了编译安装前Intelli IDEA报错:

暗示

liblept.5.dylib

找不到,编译安装后实际验证,目录

/opt/homebrew/opt/leptonica/lib/

目标文件存在于目录下,而目录

/usr/lib/

没有这个文件,但是通过IDEA再次运行测试程序,没有报错,并且可以正常识别测试图片中的字符:

测试图像

识别结果

测试图中,较大的字符串是猎鹰9号一级火箭3203的速度和高度26.1,时间为00:01:45。识别结果图片中,3203 26.1 400:01:45,可以看出速度识别正确,高度也识别正常,但是对于时间,T+被识别为数字4、这是因为我给Tesseract指定了一个字符白名单,只让它猜测0123456789.:这12个字符中的结果。

到目前为止,Tesseract 通常与 Java 集成。总结一下,先在Maven工程配置文件中引入Tess4J的JNA包,然后通过编译源码的方式安装部署Tesseract的实际本地实现。至于识别准确率,那就只能后期慢慢优化配置或者画质了。

编译并安装 OpenCV

为什么要编译?OpenCV虽然在Maven仓库中有OpenPNP编译打包的可靠函数包,但没有添加对Arm64架构MacOS的支持,只能通过代码编译。

OpenCV 源代码的最新版本是 4.5.5。经测试4.5.5版本在M1系列芯片上编译失败。个人选择4. 5.4版本编译安装。

从 GitHub 下载版本 4.5.4 的 OpenCV 源代码:

OpenCV的编译依赖于cmake和ant两个构建工具,可以通过HomeBrew安装:

brew install cmakebrew install ant

如果网络正常,10分钟左右可以完成以上两条命令。顺便说一句,如果你想查看通过 HomeBrew 安装了哪些软件包,可以使用命令:

brew list

你可以看看我目前通过 HomeBrew 安装的包的截图:

接下来进入OpenCV4.5.4的源码文件夹,创建并进入build子文件夹:

mkdir build && cd build

重头戏到了,编译配置命令如下:

cmake -DCMAKE_SYSTEM_PROCESSOR=arm64 \-DCMAKE_OSX_ARCHITECTURES=arm64 \-DWITH_OPENJPEG=OFF \-DWITH_IPP=OFF \-D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local/opencv \-D JAVA_INCLUDE_PATH=$JAVA_HOME/include \-D JAVA_AWT_LIBRARY=$JAVA_HOME/jre/lib/amd64/libawt.so \-D JAVA_JVM_LIBRARY=$JAVA_HOME/jre/lib/arm/server/libjvm.so \-D BUILD_opencv_python2=OFF \-D BUILD_opencv_java=ON \-D INSTALL_PYTHON_EXAMPLES=OFF \-D INSTALL_C_EXAMPLES=OFF \-D OPENCV_ENABLE_NONFREE=OFF \-D BUILD_EXAMPLES=ON ..

上述命令有一些注意事项:

这条命令执行起来还是很快的,两分钟左右就可以搞定:

然后使用make命令编译:

make -j8

-j后面的8表示使用8个CPU核编译,整体速度还可以,大概需要三分钟:

最后,在本地安装编译好的文件:

sudo make install

整个过程很快,大约半分钟:

...-- Installing: /usr/local/opencv/share/opencv4/lbpcascades/lbpcascade_frontalface_improved.xml-- Installing: /usr/local/opencv/share/opencv4/lbpcascades/lbpcascade_profileface.xml-- Installing: /usr/local/opencv/share/opencv4/lbpcascades/lbpcascade_silverware.xml-- Installing: /usr/local/opencv/bin/opencv_annotation-- Installing: /usr/local/opencv/bin/opencv_visualisation-- Installing: /usr/local/opencv/bin/opencv_interactive-calibration-- Installing: /usr/local/opencv/bin/opencv_version-- Installing: /usr/local/opencv/bin/opencv_model_diagnostics

至此,OpenCV编译安装成功,可以进入目录

/usr/local/opencv/share/java/opencv4

看一下生成的库文件,有两个库文件:

libopencv_java454.dylibopencv-454.jar

至此,按理说OpenCV已经在本地安装成功了。去Intellij IDEA配置新生成的本地jar文件的依赖,然后写一个测试程序,看能不能提取视频中的图片:

不幸的是,编译链接失败,说明找不到opencv的本地运行库:

此时,只需要在IDEA中为本地jar包opencv-454指定本地运行时库的位置即可:

重新运行后,我在本地找到了一个约2.4G的SpaceX Falcon 9发射视频,持续了大约25分钟,我让程序每1秒提取一张图像,看看它的表现如何:

至此,OpenCV 正式投入使用。

裁剪和识别

最后一步是让Tesseract和OpenCV协同工作,一个负责图片的提取和裁剪,一个负责文字识别。其中,我对视频进行了修剪,只提取了猎鹰九号一级火箭具有实时高度和速度的时间。持续时间少于 10 分钟。另外,你需要使用图像编辑软件,定位到需要切割高度、速度和时间的点的坐标、长度和宽度,然后开始移动!

话不多说,直接运行看看结果:

经过实际测试,识别成功率还是挺高的,极少数情况下速度不会被识别。

结束语

总体来说,这个方案是可行的,未来要做三件事:

尝试在生成图像的同时使用OpenCV进行降噪处理,以提高后期图像识别的准确性。

尝试为Tesseract配置字体、调整色差等优化操作,提高识别成功率。

将猎鹰9号的实时数据写入数据库进行统计分析也是本期的核心目标!

另外,这篇文章是边练边写的,可能有点太长了,肯定有一些误解或者配置方法不优化。如果读者是编程大神,请给我一些建议!君越兆星辰期待您的关注!

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论