欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

debian9/ubuntu18/deepin 编译安装opencv for java和eclipse环境配置

程序员文章站 2022-07-13 22:18:52
...

写在前
现在是2020.12,此时debian10已经出了。但是在debian10上编译出来的java库并不能够识别。原因没有找到。然后又在debian9、ubuntu18和deepin上进行测试,都能够正确编译。中间有很多坑。尤其是我用debian10编译的时候,坑了我一天半,最后换系统皆大欢喜。在此分享给大家心酸历程。

opencvForJava

1. 编译过程

  1. 从OpenCV官网下载源码,这里以4.12为例
  2. 解压源码包。目录结构为:
opencv-4.1.2/
├── 3rdparty
├── apps
├── cmake
├── CMakeLists.txt
├── CONTRIBUTING.md
├── data
├── doc
├── include
├── LICENSE
├── modules
├── platforms
├── README.md
└── samples

进入opencv-4.1.2

#进入文件夹
cd opencv-4.1.2
#创建build文件夹
mkdir build
#进入build文件夹
cd build
  1. 安装环境
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev

$ 注意 $ : libjasper-dev 无法找到。如果你是Ubuntu,就需要添加一个源,如果你是debian,可能就需要自己编译了。
当然我用不上这个插件,就直接把这个包去掉了。不安装libjasper-dev

  1. 开始cmake生产makefile文件
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local BUILD_SHARED_LIBS=OFF ..
#这个有很多选项。我用默认的就可以编译出java

注意,坑来了!

如果这里cmake成功之后,在你的输出日志最后几行有这个:

--   Java:                          
--     ant:                         /usr/bin/ant (ver 1.10.5)
--     JNI:                         /opt/jdk1.8/include /opt/jdk1.8/include/linux /opt/jdk1.8/include
--     Java wrappers:               YES
--     Java tests:                  YES

恭喜你,不用折腾了。直接make就可以。
否则,分成以下几种情况:

坑1. ant:为no

说明你没有安装ant或者对于找不到ant的安装位置。

#1. 安装ant
sudo apt install ant

#2. 如果安装成功,重新运行cmake,ant还是没有被识别,那么你需要手动添加ant的位置
# 直接终端运行
export ANT_HOME=/usr/share/ant/ #当然你把这句话写到/etc/profile最后一行也行。记得要source /etc/profile一下
#回到build 目录,重新cmake以下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local BUILD_SHARED_LIBS=OFF ..

补充:如果你的ant不在/usr/share/ant,你需要自己定位安装文件夹。

#查看ant位置
whereis ant
#得到的位置是一个软连接,所以要看链接到哪里
ls -an _whereis得到的第一个_
安装目录有bin、etc、lib三个文件夹
检查软链接的目录是不是安装目录。不是继续ls -an查它。

坑2. JNI为no

  • 可能原因你没安装java。安装它
  • 已经安装java,但是没有设置JAVA_HOME
export JAVA_HOME=xxxxxxxx #你javahome的地址。

如果有多个java,需要设置默认的java环境。搜索如何设置。我另一篇帖子有。
4.12 在oracle jdk1.8 和open jdk11都编译通过。open jdk1.8没有尝试。

如果你 ANT和JNI都没问题。剩下两个 应该也是yes了。

  1. make -j8 我的是4核8线程,所以是8比较快。当然写1234567都可以。
  2. 等待编译成功。如果你只是用java,不需要执行make install
    如果你要在c++里面用,需要执行sudo make install

2. 环境配置

以eclipse为例,idea我尝试,不敢乱说。
Linux下还是简单的。只需要两步:

  1. Window -> Preference, 选择Java -> Build Path -> User Libraries选项卡
  2. 右侧点击new,输入opencv4.12,
    选中opencv4.12,点击add external jars, 选择刚才build/bin/opencv412.jar
  3. 点开opencv412.jar, Native library location 设置为build下的lib文件夹。
    保存即可

如果没有说明你的编译有问题,查看cmake的记录。是否有java选项

3. 环境测试

详见官网eclipse配置
新建工程。在build path中加入刚才的opencv4.12库

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class Hello
{
   public static void main( String[] args )
   {
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
      System.out.println( "mat = " + mat.dump() );
   }
}

写在最后:在debian10里面loadLibrary总出问题,最终也没找到原因。所以换到了其他的。其实兜兜转转,自己纵向成为特别一点的人,这么多年一直有些抵触ubuntu。但是,不得不说ubuntu是挺省心的。从debian10换到debian9,又因为声卡问题换到了ubuntu。有时候过度的折腾反而是浪费时间。已经过了折腾的年纪,系统于我就是生产力工具。如果这次直接上ubuntu,可能一下午就完事了。一切顺风顺水。
如果只是把linux当做生产力工具,尽量不要选择最新的系统。