SpringBoot使用OpenCV示例总结

前言

最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库;而现在的项目都是基于SpringBoot,需要把OpenCv整合进去,下面把在使用中遇到的问题进行一个汇总整理。

下载安装

Opencv官网提供了一个多个平台的版本包括:Windows,IOS,Android,地址如下:opencv.org/releases/;因为开发在Windows平台,发布在Linux平台,所以我们这里至少需要两个版本;

windows平台

直接可以在官网下载opencv-3.4.10-vc14_vc15.exe安装即可,安装完会出现opencv文件夹在build\java目录下有我们需要的opencv-3410.jar,x64/opencv_java3410.dll,x86/opencv_java3410.dll文件;

Linux平台

Linux平台需要我们手动编译,下载opencv-3.4.10.zip,解压到/user/local目录下,然后编译安装,执行如下命令:

cd /usr/local/opencv-3.4.10
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..
make -j8
sudo make install

安装完之后可以在build/bin目录下找到opencv-3410.jar,在build/lib目录下找到libopencv_java3410.so

整合使用

两个平台分别安装完之后,获取了对应的dll和so文件;两个平台获取到的jar都是一样的,随便用哪个都可以,下面看看如何使用

外部引用方式

通过把应用jar与本地库文件进行分隔开,然后在项目中进行引用

相对路径方式

可以通过System.loadLibrary来指定本地库文件,但是这种方式需要在运行时指定-Djava.library.path,具体可以提供配置类:

@Configuration
public class NativeConfig {
 static {
  System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 }
}

运行时需要在VM arguments中添加-Djava.library.path=对应dll存放的路径,不然会出现如下错误:

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java3410 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) ~[na:1.8.0_251]
    at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[na:1.8.0_251]
    at java.lang.System.loadLibrary(System.java:1122) ~[na:1.8.0_251]
    at com.springboot.opencv.NativeConfig.<clinit>(NativeConfig.java:10) ~[classes/:na]

绝对路径方式

可以通过System.load来指定本地库函数的绝对路径:

@Configuration
public class NativeConfig {
 static {
  System.load("C:\\Users\\opencv\\build\\java\\x64\\opencv_java3410.dll");
 }
}

踩坑1

在IDE中运行使用Opencv功能的时候,出现如下错误:

java.lang.UnsatisfiedLinkError: org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J
    at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method) ~[opencv-3.4.10.jar:unknown]
    at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:332) ~[opencv-3.4.10.jar:unknown]
    at com.springboot.opencv.OpenCVController.testOpenCV(OpenCVController.java:13) ~[classes/:na]

很明显是在使用jar包里面的方法时没有找到对应的本地库函数,也就是说loadLibrary没有成功,但是之前其实在本地Java项目中是有进行测试的,可以通过的,猜测是不是使用了什么工具导致加载失败,最终锁定在spring-boot-devtools工具包,提供了动态加载等功能,直接移除此工具包,或者配置如下开关:

System.setProperty("spring.devtools.restart.enabled", "false");

内部引用方式

为了更加简单部署,可以把本地库文件和项目文件打成一个jar包,可以把本地库文件放在resources目录下,这样可以打成一个jar包,现在的主要问题就是如何加载jar包里面的本地库文件,通过测试发现可以读取到resources目录下的库文件,但是通过system.load并不能去加载成功,对应的是一个类似如下的路径:

file:/C:/Users/Administrator.SKY-20170404CXG/Desktop/springboot-0.0.1-SNAPSHOT.j
ar!/BOOT-INF/classes!/opencv

最后采用的方式是把读取的库文件,存放到系统的一个临时文件夹下,然后拿到库文件的绝对路径,这样就可以通过system.load直接去加载,具体实现代码可以参考Github

踩坑2

在执行maven编译打包的时候,发现本地库文件(dll或者so文件)体积会变大,猜测maven在编译的时候对本地库文件也进行了编译,具体如何禁用指定的文件格式编译,而只需要拷贝即可:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-resources-plugin</artifactId>
 <configuration>
  <encoding>UTF-8</encoding>
  <!-- maven编译下面扩展类型文件的时候直接复制原文件,而不会进行二次编码-->
  <nonFilteredFileExtensions>dll,so</nonFilteredFileExtensions>
 </configuration>
</plugin>

第三方Jar包

除了以上两种需要我们自己去实现加载的方式,其实还可以直接使用第三方提供的jar包OpenPnp,里面包含了OpenCV.jar,对应各个平台的本地库,以及加载本地库的封装类;查看其源码可以发现,其实也是通过判断当前系统,然后将对应的本地库文件拷贝到系统的临时文件夹下,最后通过system.load去加载:

Files.createTempDirectory(`opencv_openpnp`);

因为此包兼顾了所有平台,所以整个包有点大,一百多M,如果部署的系统确定,其实可以自己去加载指定库文件就可以了,然后以相同的方式打成一个公共包供各个系统使用;

总结

本文虽然介绍的是在项目中使用OpenCV的一些总结,但其实其他的本地库也可以使用相同的方式;本文重点记录一下在使用过程中遇到的那些坑,以及加载库文件的方式。

到此这篇关于SpringBoot使用OpenCV示例总结的文章就介绍到这了,更多相关SpringBoot使用OpenCV内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python使用opencv按一定间隔截取视频帧

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • python使用pycharm环境调用opencv库

    我这只学术的小小只白,竟然也开始写博客了.因为配置opencv的库用了很长的时间,三天,遇到很多问题,一个个解决后,才决定分享出来,想要用pythont调用opencv库的少走些弯路.写这篇文章另一方面是收到浅墨--毛星云的博客的影响,浅墨博主,真的是无私的分享了自己的代码,我是一个很懒得人,深受影响,做个不懒惰的人. 首先安装python,有2.X和3.X,两个版本有很大的不同.我用的是2.7,2.系列支持opencv的很多库. Python下载链接: https://www.python.o

  • python使用opencv读取图片的实例

    安装好环境后,开始了第一个Hello word 例子,如何读取图片,保存图品 import cv2 import numpy as np import matplotlib.pyplot as plt #读取图片代码 img = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE) #IMREAD_COLOR = 1 #IMREAD_UNCHANGED = -1 #展示图片 cv2.imshow('image',img) cv2.waitKey(0) cv2.d

  • Ubuntu中Opencv的安装使用教程

    前言 OpenCV为基于BSD许可(开源)发行的跨平台计算机视觉库,可运行在Linux.Windows和Mac OS上.它轻量级而且高效,提供了Python.Ruby.MATLAB等语言接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV不仅在进行软件开发的过程中需要用到,而且他也是很多开源软件的运行依赖,所以安装一个Opencv就很有必要了,即使自己本身并不想学习使用. 安装 以下主要是从百度上找到的可用方法: 安装运行依赖 $ sudo apt-get install libq

  • python中使用OpenCV进行人脸检测的例子

    OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: 复制代码 代码如下: $ sudo apt-get install python-opencv 具体原理就不多说了,可以参考一下这篇文章.直接上源码. 复制代码 代码如下: #!/usr/bin/python# -*- coding: UTF-8 -*- # face_detect.py # Face De

  • opencv python 傅里叶变换的使用

    理论 傅立叶变换用于分析各种滤波器的频率特性,对于图像,2D离散傅里叶变换(DFT)用于找到频域.快速傅里叶变换(FFT)的快速算法用于计算DFT. 于一个正弦信号,x(t)=Asin(2πft),我们可以说 f 是信号的频率,如果它的频率域被接受,我们可以看到 f 的峰值.如果信号被采样来形成一个离散信号,我们得到相同的频率域,但是在[−π,π] or [0,2π]范围内是周期性的 (or [0,N] for N-point DFT). 可以将图像视为在两个方向上采样的信号.因此,在X和Y方向

  • Python实现OpenCV的安装与使用示例

    本文实例讲述了Python实现OpenCV的安装与使用.分享给大家供大家参考,具体如下: 由于下一步要开始研究下深度学习,而深度学习领域很多的算法和应用都是用Python来实现的,把Python转成C++代码耗时太多,不如直接学习下Python直接医用Python的代码.搭建Python环境的过程是很耗时的,但是现在回头来看又觉得其实没有多少步骤,主要是在自己不明白的时候老是会出现各种各样奇奇怪怪的问题.现在只是对正确的步骤做个记录吧. 环境搭建: 1.Python的安装,没什么可说的,一直下一

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

  • Python中使用OpenCV库来进行简单的气象学遥感影像计算

    OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用.OpenCV可用于开发实时的图像处理.计算机视觉以及模式识别程序.该程序库也可以使用英特尔公司的IPP进行加速处理. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python, Java and MATLAB/OCTAVE

  • 详解使用JavaCV/OpenCV抓取并存储摄像头图像

    本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中.点击JFrame关闭按钮可以退出程序. 实现: import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; imp

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

随机推荐