最近項目遇到一個問題,springboot2在打包過程中出現的問題;
1、引用本地的jar包,怎麼打包到項目;
pom.xml 配置
dependencies標籤配置
<!--打包本地jar包-->
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/opencv-440.jar</systemPath>
</dependency>
其中,version爲必填,嘗試過省略,報錯;
plugins標籤配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<!-- 打包本地jar包 -->
<extdirs>${project.basedir}/src/main/resources/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
resources標籤 配置
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>lib/*.jar</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>lib/*.dll</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*/*.xml</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*/*.json</include>
</includes>
</resource>
</resources>
2、opencv使用人臉識別過程中,需要引入haarcascade_frontalface_alt2.xml文件,如果放在項目的lib文件中,在打包的過程中能夠打到包裏,但是在動態引用的過程中,由於jar包中文件的引用出現混亂路徑的情況,找不到文件。找到一個折中的辦法,haarcascade_frontalface_alt2.xml文件放到固定目錄下,再引用的時候,只需要讀取固定的路徑即可。
yml文件配置
path:
resourcePath: C:\haarcascade_frontalface_alt2.xml # 人臉識別的xml配置文件
NativeConfig.java類
package com.hake.smart.configration;
import com.hake.smart.ymlconfig.YmlConfigUtil;
import lombok.extern.slf4j.Slf4j;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ClassUtils;
import javax.annotation.Resource;
import java.util.Arrays;
/**
* @Author: Liu Yue
* @Descripition:
* @Date; Create in 2020/8/25 15:59
**/
@Configuration
@Slf4j
public class NativeConfig {
@Resource
private YmlConfigUtil ymlConfigUtil;
@Value("${path.resourcePath}")
private static String resourcePath;
@Value(value = "${path.resourcePath}")
private void setResourcePath(String resourcePath){
this.resourcePath = resourcePath ;
}
@Bean
public NativeConfig initFrontalface(){
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
log.error("路徑:{}",resourcePath);
faceDetector = new CascadeClassifier(resourcePath);
return new NativeConfig();
}
/**
* 測試OpenCV是否能運行:需要自行修改圖片位置
* @throws Exception 測試是否成功
*/
static CascadeClassifier faceDetector;
/* static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//String url = "C:/hake/gitremote/hakesmartacceptback/target/classes/lib/haarcascade_frontalface_alt2.xml";
//ClassPathResource("lib/haarcascade_frontalface_alt2.xml");
*//*ClassPathResource resource = new ClassPathResource("lib/haarcascade_frontalface_alt2.xml");
String path = resource.getPath();
path = basepath + path;*//*
URL urlClass = ClassLoader.getSystemResource("lib/haarcascade_frontalface_alt2.xml");
String path = urlClass.getPath();
log.error("路徑:{}",path);
path = path.substring(1,path.length());
faceDetector = new CascadeClassifier(path);
}*/
private Mat conv_Mat(String img_1) {
Mat image0 = Imgcodecs.imread(img_1);
Mat image = new Mat();
//灰度轉換
Imgproc.cvtColor(image0, image, Imgproc.COLOR_BGR2GRAY);
MatOfRect faceDetections = new MatOfRect();
//探測人臉
faceDetector.detectMultiScale(image, faceDetections);
// rect中是人臉圖片的範圍
for (Rect rect : faceDetections.toArray()) {
//切割rect人臉
Mat mat = new Mat(image, rect);
return mat;
}
return null;
}
//比較圖片相似度
public Boolean compare_image(String img_1, String img_2) {
Mat mat_1 = conv_Mat(img_1);
Mat mat_2 = conv_Mat(img_2);
Mat hist_1 = new Mat();
Mat hist_2 = new Mat();
//顏色範圍
MatOfFloat ranges = new MatOfFloat(0f, 256f);
//直方圖大小, 越大匹配越精確 (越慢)
MatOfInt histSize = new MatOfInt(1000);
Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);
Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);
// CORREL 相關係數
double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
log.info("OPENCV人臉相似度:{}",res);
int lifePhotostandard = ymlConfigUtil.getLifePhotostandard();
log.info("相識度標準:{}",lifePhotostandard);
boolean bl = res * 100 > lifePhotostandard ? true:false;
return bl;
}
}
每天提高一點點