亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot使用OpenCV示例總結(jié)

 更新時間:2020年08月11日 11:53:45   作者:ksfzhaohui  
這篇文章主要介紹了SpringBoot使用OpenCV示例總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近有個項目需要對圖片圖像進行處理,使用到了開源框架OpenCV全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫;而現(xiàn)在的項目都是基于SpringBoot,需要把OpenCv整合進去,下面把在使用中遇到的問題進行一個匯總整理。

下載安裝

Opencv官網(wǎng)提供了一個多個平臺的版本包括:Windows,IOS,Android,地址如下:opencv.org/releases/;因為開發(fā)在Windows平臺,發(fā)布在Linux平臺,所以我們這里至少需要兩個版本;

windows平臺

直接可以在官網(wǎng)下載opencv-3.4.10-vc14_vc15.exe安裝即可,安裝完會出現(xiàn)opencv文件夾在build\java目錄下有我們需要的opencv-3410.jar,x64/opencv_java3410.dll,x86/opencv_java3410.dll文件;

Linux平臺

Linux平臺需要我們手動編譯,下載opencv-3.4.10.zip,解壓到/user/local目錄下,然后編譯安裝,執(zhí)行如下命令:

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存放的路徑,不然會出現(xiàn)如下錯誤:

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來指定本地庫函數(shù)的絕對路徑:

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

踩坑1

在IDE中運行使用Opencv功能的時候,出現(xiàn)如下錯誤:

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包里面的方法時沒有找到對應的本地庫函數(shù),也就是說loadLibrary沒有成功,但是之前其實在本地Java項目中是有進行測試的,可以通過的,猜測是不是使用了什么工具導致加載失敗,最終鎖定在spring-boot-devtools工具包,提供了動態(tài)加載等功能,直接移除此工具包,或者配置如下開關(guān):

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

內(nèi)部引用方式

為了更加簡單部署,可以把本地庫文件和項目文件打成一個jar包,可以把本地庫文件放在resources目錄下,這樣可以打成一個jar包,現(xiàn)在的主要問題就是如何加載jar包里面的本地庫文件,通過測試發(fā)現(xiàn)可以讀取到resources目錄下的庫文件,但是通過system.load并不能去加載成功,對應的是一個類似如下的路徑:

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

最后采用的方式是把讀取的庫文件,存放到系統(tǒng)的一個臨時文件夾下,然后拿到庫文件的絕對路徑,這樣就可以通過system.load直接去加載,具體實現(xiàn)代碼可以參考Github

踩坑2

在執(zhí)行maven編譯打包的時候,發(fā)現(xiàn)本地庫文件(dll或者so文件)體積會變大,猜測maven在編譯的時候?qū)Ρ镜貛煳募策M行了編譯,具體如何禁用指定的文件格式編譯,而只需要拷貝即可:

<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包

除了以上兩種需要我們自己去實現(xiàn)加載的方式,其實還可以直接使用第三方提供的jar包OpenPnp,里面包含了OpenCV.jar,對應各個平臺的本地庫,以及加載本地庫的封裝類;查看其源碼可以發(fā)現(xiàn),其實也是通過判斷當前系統(tǒng),然后將對應的本地庫文件拷貝到系統(tǒng)的臨時文件夾下,最后通過system.load去加載:

Files.createTempDirectory(`opencv_openpnp`);

因為此包兼顧了所有平臺,所以整個包有點大,一百多M,如果部署的系統(tǒng)確定,其實可以自己去加載指定庫文件就可以了,然后以相同的方式打成一個公共包供各個系統(tǒng)使用;

總結(jié)

本文雖然介紹的是在項目中使用OpenCV的一些總結(jié),但其實其他的本地庫也可以使用相同的方式;本文重點記錄一下在使用過程中遇到的那些坑,以及加載庫文件的方式。

到此這篇關(guān)于SpringBoot使用OpenCV示例總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot使用OpenCV內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程實現(xiàn)對象克?。◤椭疲┐a詳解

    Java編程實現(xiàn)對象克?。◤椭疲┐a詳解

    這篇文章主要介紹了Java編程實現(xiàn)對象克隆(復制)代碼詳解,涉及了克隆的原因,如何實現(xiàn)克隆,克隆的一般步驟,深克隆與淺克隆的介紹等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • 關(guān)于單例模式懶漢式和餓漢式的區(qū)別及說明

    關(guān)于單例模式懶漢式和餓漢式的區(qū)別及說明

    這篇文章主要介紹了關(guān)于單例模式懶漢式和餓漢式的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java網(wǎng)絡編程之群聊功能

    java網(wǎng)絡編程之群聊功能

    這篇文章主要為大家詳細介紹了java網(wǎng)絡編程之群聊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中Jar包反編譯解壓和壓縮操作方法

    Java中Jar包反編譯解壓和壓縮操作方法

    JAR文件就是Java 檔案文件Java Archive,它是 Java 的一種文檔格式,這篇文章主要介紹了Java中Jar包反編譯解壓和壓縮,需要的朋友可以參考下
    2023-09-09
  • 淺談Java開發(fā)架構(gòu)之領(lǐng)域驅(qū)動設(shè)計DDD落地

    淺談Java開發(fā)架構(gòu)之領(lǐng)域驅(qū)動設(shè)計DDD落地

    DDD(Domain-Driven Design 領(lǐng)域驅(qū)動設(shè)計)是由Eric Evans最先提出,目的是對軟件所涉及到的領(lǐng)域進行建模,以應對系統(tǒng)規(guī)模過大時引起的軟件復雜性的問題
    2021-06-06
  • Java注釋和關(guān)鍵字實例詳解

    Java注釋和關(guān)鍵字實例詳解

    注釋是對程序語言的說明,有助于開發(fā)者和用戶之間的交流,方便理解程序,注釋不是編程語句,因此被編譯器忽略,下面這篇文章主要給大家介紹了關(guān)于Java注釋和關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Spring使用注解存儲Bean對象的方法詳解

    Spring使用注解存儲Bean對象的方法詳解

    在使用學習使用 Spring過程中,當我們要實現(xiàn)一個功能的時候,先應該考慮的是有沒有相應的注解是實現(xiàn)對應功能的,Spring 中很多功能的配置都是可以依靠注解實現(xiàn)的,而本篇中介紹的是使用注解來存儲 Bean 對象
    2023-07-07
  • java多線程通過CompletableFuture組裝異步計算單元

    java多線程通過CompletableFuture組裝異步計算單元

    這篇文章主要為大家介紹了java多線程通過CompletableFuture組裝異步計算單元,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • SpringBoot中并發(fā)定時任務的實現(xiàn)、動態(tài)定時任務的實現(xiàn)(看這一篇就夠了)推薦

    SpringBoot中并發(fā)定時任務的實現(xiàn)、動態(tài)定時任務的實現(xiàn)(看這一篇就夠了)推薦

    這篇文章主要介紹了SpringBoot并發(fā)定時任務動態(tài)定時任務實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • SpringBoot如何打印mybatis的執(zhí)行sql問題

    SpringBoot如何打印mybatis的執(zhí)行sql問題

    這篇文章主要介紹了SpringBoot如何打印mybatis的執(zhí)行sql問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論