一小時,從零實現Java人臉識別
本案例成功與2021,09,02
此樣圖在本教程基礎可實現,並非完全次教程實例圖。
1. 安裝OpenCv環境
實驗環境為win,自行選擇

下載成功后,安裝即可
2. 進入開發
本案例使用Maven搭建
pom.xml(注意maven的opencv和自己下載的opencv版本需一致)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Opencv</groupId>
<artifactId>Opencv</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.5.3-1.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
編寫實體類
/**
* @Author: 王居三木超
* @Description: TODO
* @DateTime: 2021/9/2 19:54
**/
public class CvtMatEntity {
//原圖Mat
public Mat img;
//灰度圖Mat
public Mat gray;
public static CvtMatEntity cvtR2G(Mat img){
CvtMatEntity cvtMatEntity = new CvtMatEntity();
Mat rgb = new Mat();
//實現圖片灰度轉換
Imgproc.cvtColor(img, rgb, Imgproc.COLOR_BGR2RGB);
Mat gray = new Mat();
Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY);
//賦值
cvtMatEntity.img = img;
cvtMatEntity.gray = gray;
//返回
return cvtMatEntity;
}
}
編寫核心類
/**
* @Author: 王居三木超
* @Description: TODO
* @DateTime: 2021/9/2 17:41
**/
public class InitInstance {
private static Logger logger = LoggerFactory.getLogger(InitInstance.class);
//臉部識別實例
private static CascadeClassifier faceDetector;
//此類加載人臉識別模塊
public static void init(String dllAbsPath, String facexmlAbsPath, String eyexmlAbsPath) {
logger.info("開始讀取臉部識別實例");
//加載dll文件
System.load(dllAbsPath);
faceDetector = new CascadeClassifier(facexmlAbsPath);
if (faceDetector.empty()) {
logger.error("人臉識別模塊讀取失敗");
} else logger.info("人臉識別模塊讀取成功");
}
//此類實現打開視頻,識別人臉
public static void videoDetectorModel() {
//打開攝像頭
VideoCapture videoCapture = new VideoCapture(0);
//判斷攝像頭是否打開
if (!videoCapture.open(0)) {
logger.error("相機打開失敗");
return;
}
while (true) {
//創建圖片Mat
Mat img = new Mat();
//讀取攝像頭下的圖像
if (!videoCapture.read(img)) return;
//為保證教程詳細度,此處不調用實體方法,大家可自行選擇
//圖片灰度轉化
Mat rgb = new Mat();
Imgproc.cvtColor(img, rgb, Imgproc.COLOR_BGR2RGB);
Mat gray = new Mat();
Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY);
//創建人臉識別出的矩形變量
MatOfRect faveRect = new MatOfRect();
//檢測人臉
faceDetector.detectMultiScale(gray, faveRect);
//圖形面勾選人臉
for (Rect re : faveRect.toArray()) {
Imgproc.rectangle(img, new Point(re.x, re.y), new Point(re.x + re.width, re.y + re.height), new Scalar(0, 0, 255), 2);
}
//顯示在屏幕
HighGui.imshow("人臉識別", img);
//按'q'退出
if (HighGui.waitKey(1) == 81) break;
}
//釋放資源
videoCapture.release();
HighGui.destroyAllWindows();
}
//以下內容為對比人臉模塊。與打開視頻,識別人臉完全分離
/**
* 獲取灰度人臉
*/
public static Mat conv_Mat(String img) {
//讀取圖片Mat
Mat imgInfo = Imgcodecs.imread(img);
//此處調用了實體方法,實現灰度轉化
CvtMatEntity cvtMatEntity = CvtMatEntity.cvtR2G(imgInfo);
//創建Mat矩形
MatOfRect faceMat = new MatOfRect();
//識別人人臉
faceDetector.detectMultiScale(cvtMatEntity.gray, faceMat);
for (Rect rect : faceMat.toArray()) {
//選出灰度人臉
Mat face = new Mat(cvtMatEntity.gray, rect);
return face;
}
return null;
}
/**
* 圖片對比人臉
*/
public static double 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(10000000);
//實現圖片計算
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);
// 相關系數,獲得相似度
double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
//返回相似度
return res;
}
}
3. 主函數調用
/**
* @Author: 王居三木超
* @Description: TODO
* @DateTime: 2021/9/2 17:32
**/
public class openapiMainApplication {
public static void main(String[] args) throws UnsupportedEncodingException {
//此為opencv的opencv_java453.dll
//位置在opencv安裝目錄下的build\\java\\x64\\位置
String dllAbsPath = "D:\\Users\\86159\\Desktop\\CloudPool\\opencv\\opencv\\build\\java\\x64\\opencv_java453.dll";
//位置在opencv安裝目錄下的sources\\data\\haarcascades\\位置
String facexmlAbsPath = "D:\\Users\\86159\\Desktop\\CloudPool\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
//必須加載
InitInstance.init(dllAbsPath, facexmlAbsPath,eyexmlAbsPath);
// InitInstance.videoDetectorModel();
// System.out.println(InitInstance.compare_image("D:\\Users\\86159\\Desktop\\TEST\\2.png", "D:\\Users\\86159\\Desktop\\TEST\\2.png"));
}
}
