Bootstrap

Java - 在Linux系统上使用OpenCV和Tesseract

系统环境

确保Linux系统安装了cmake构建工具,以及java和ant(这两者如果没有,可能会影响到后面编译opencv生成.so和.jar文件)。

sudo apt-get update
sudo apt-get install build-essential
sudo apt install cmake
  • build-essential 包包含了 GCC、G++ 以及其他编译所需的工具。

下载OpenCV

从GitHub(Releases · opencv/opencv · GitHub)下载OpenCV的Sources源码包到本地,本文使用的是 OpenCV 4.10.0 版本,如下图:

wget -O 4.10.0.tar.gz https://github.com/opencv/opencv/archive/refs/tags/4.10.0.tar.gz 

 构建OpenCV

1、解压

tar -zxvf opencv-4.10.0.tar.gz 

2、cd opencv-4.10.0,然后 mkdir build,新建build目录,准备编译opencv

cd opencv-4.10.0/ && mkdir build

此时opencv-4.10.0目录下内容如图:

 3、cd build,进入到刚才新建的build目录,使用cmake命令编译opencv,命令如下:

cd build
cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX=/home/summergao/opencv_install ..
  • BUILD_SHARED_LIBS=OFF,目的是让opencv各模块(比如core、imgproc等)的代码经过编译后集中在一个.so文件中,方便加载
  • CMAKE_INSTALL_PREFIX=/home/summergao/opencv_install,指定了opencv的安装目录(opencv_install也是自己新建的),如果只是为了编译得到.so文件,此参数可以不写
  • 最后的 .. 表示CMakeLists.txt所在的目录,相对于当前目录build,就是上级目录。

运行命令后,控制台部分打印信息如下:

 

这里列出了即将要编译的模块; 

 没有安装java和ant,这里就会全部展示为NO,此外编译高版本的opencv时,此处如果有Java wrappers属性为NO,则需要配置JAVA_HOME环境变量。

构建常见问题及解决办法

You should create a separate directory for build files.

解决办法:执行 rm CMakeCache.txt 命令清除 CMake 的缓存信息

rm CMakeCache.txt

执行 rm CMakeCache.txt 命令的主要目的是清除 CMake 的缓存信息。当你在使用 CMake 构建项目的过程中遇到以下情况时,可能需要清除这个缓存文件:

1. 更改了 CMake 配置选项

如果你在修改了 CMakeLists.txt 文件或者想要更改之前 cmake 命令中的配置选项(如 -D 参数指定的变量),但发现新的配置没有生效,可能是因为 CMake 仍然使用了之前缓存的设置。此时,删除 CMakeCache.txt 文件,然后重新运行 cmake 命令,CMake 就会重新进行配置,使用新的选项。

2. 编译器或依赖库路径发生变化

如果系统中编译器的路径或者依赖库的安装路径发生了改变,CMake 可能仍然使用旧的路径信息。删除缓存文件后,重新运行 cmake,它会重新查找这些路径,确保使用最新的配置。

3. 解决 CMake 配置错误

有时候,CMake 在配置过程中可能会出现一些错误,这些错误可能是由于缓存文件中的信息不一致导致的。通过删除 CMakeCache.txt 文件,可以尝试解决这些配置错误

编译OpenCV

执行命令:make,开始编译,经过较长时间的等待,如果进度到100%且没有报错,则编译完成;此时build目录下生成了一系列文件,其中lib目录中,就有我们需要的libopencv_java4100.so 文件,此外bin目录中,还生成了 opencv-4100.jar 这个jar包文件。

make

安装OpenCV

执行命令:make install,则会开始安装opencv,不过我们已经拿到了.so文件,能够实现java程序中的调用,这步可以省去。

make install

正常来说,有了.so文件,我们的java程序就可以在Linux系统上,使用System.load方法来加载它,从而使用OpenCV的功能了;如果加载过程中报错,提示依赖文件(比如xx.so)没有找到,可以使用 sudo apt-get install 命令安装依赖后再试。
可能需要的依赖项:libjpeg-turbo-devel、libpng-devel、libtiff-devel、jasper-devel、gtk2-devel、gstreamer-plugins-base-devel,如果他们已经被安装,通常可以在/usr/lib64这个文件夹下找到对应的.so文件。

static {
    URL url = ClassLoader.getSystemResource("/home/summergao/opencv-4.10.0/build/lib/libopencv_java4100.so");
    System.load(url.getPath());
}

安装Tesseract

Linux系统上,如果没有安装Tesseract,java程序中使用Tesseract的doOcr方法进行图像识别时,会报错,提示找不到Tesseract相关的库文件。

解决方法:

sudo apt-get install tesseract-ocr

 参考

Java - 在Linux系统上使用OpenCV和Tesseract_java opencv linux-CSDN博客

;