這裏使用的是JavaCV的人臉識別、人臉匹配部分:
代碼中的註釋寫的比較清楚了,就不多解釋了。
package com.bank.demo.face;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import static org.bytedeco.javacpp.opencv_core.*;
import java.nio.IntBuffer;
import java.nio.charset.StandardCharsets;
import org.bytedeco.javacv.FrameGrabber.Exception;
import javax.swing.*;
import java.io.*;
import static org.bytedeco.javacpp.opencv_core.CV_32SC1;
import static org.bytedeco.javacpp.opencv_imgproc.*;
/**
* @author bank
* @date 2020/4/18 23:09
*/
public class faceRecognize {
public boolean faceRecognize(String name) {
//CSV文件
File file=new File("D:\\ORL\\csv.txt");
int testtimes=0,showtimes=0;
try {
if(!file.exists()){
System.out.println("沒有找到CSV文件");
System.exit(0);
}
//讀取CSV文件
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
String line=null;
//圖片保存,對應訓練樣本數
MatVector images=new MatVector(410);
//設置標籤值,對應樣本數
opencv_core.Mat lables=new opencv_core.Mat(410,1,CV_32SC1);
IntBuffer lablesBuf=lables.createBuffer();
int num=0;//用於打上標籤
while ((line=reader.readLine())!=null){
String[] split = line.split(";");
String picPath=split[0];
int lable=Integer.valueOf(split[1]);
//放入圖片
images.put(num,opencv_imgcodecs.imread(picPath,0));
//放入標籤
lablesBuf.put(num,lable);
num++;
}
//創建分類器
opencv_face.FisherFaceRecognizer fisherFaceRecognizer= opencv_face.FisherFaceRecognizer.create();
fisherFaceRecognizer.train(images,lables);
//保存訓練結果
fisherFaceRecognizer.save("MyFisherFaceRecognizer.xml");
//讀取自己的訓練結果
fisherFaceRecognizer.read("MyFisherFaceRecognizer.xml");
//設置閾值,閾值爲0則沒有匹配,閾值特別大時任意匹配,檢測返回爲-1時,則不能和訓練結果匹配
fisherFaceRecognizer.setThreshold(3000.0);
//開啓窗口開始人臉測試。
OpenCVFrameGrabber grabber=new OpenCVFrameGrabber(0);
grabber.setImageWidth(640);
grabber.setImageHeight(480);
grabber.start();
//開啓攝像頭,獲取圖像(得到的圖像爲frame類型,需要轉換爲mat類型進行檢測)
CanvasFrame canvas=new CanvasFrame("人臉檢測");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
opencv_objdetect.CascadeClassifier classifier=new opencv_objdetect.CascadeClassifier("D:\\openCV\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface_improved.xml");
while(true) {
if (!canvas.isEnabled()) {
grabber.stop();
System.exit(0);
}
//抓取一針
Frame frame=grabber.grab();
//類型轉換
OpenCVFrameConverter.ToMat converter=new OpenCVFrameConverter.ToMat();
//用於保存灰圖
Mat grey=new Mat();
Mat original=converter.convertToMat(frame);
//用於保存關注
Mat roi=new Mat();
//用於保存臉部
Mat face=new Mat();
opencv_imgproc.cvtColor(original,grey, COLOR_BGRA2GRAY);
equalizeHist(grey,grey);
//檢測人臉
RectVector faces=new RectVector();
classifier.detectMultiScale(grey,faces);
IntPointer lable=new IntPointer(1);
DoublePointer confidence=new DoublePointer(1);
//識別部分
for(int i=0;i<faces.size();i++){
Rect rect=faces.get(i);
rectangle(original,rect,new Scalar(0,255,0,1));
roi=new Mat(grey,rect);
resize(roi,face,new Size(92,112));
fisherFaceRecognizer.predict(face,lable,confidence);
int predictedLable=lable.get(0);
if(predictedLable==36){
String box_name="people:bank";
int pos_x=Math.max(rect.tl().x()-10,0);
int pos_y=Math.max(rect.tl().y()-10,0);
putText(original,box_name,new Point(pos_x,pos_y),FONT_HERSHEY_PLAIN,1.0,new Scalar(0,255,0,2.0));
testtimes++;
}else{
int pos_x=Math.max(rect.tl().x()-10,0);
int pos_y=Math.max(rect.tl().y()-10,0);
putText(original,"UnknownPeople!",new Point(pos_x,pos_y),FONT_HERSHEY_PLAIN,1.0,new Scalar(0,0,255,2.0));
}
}
//顯示
frame=converter.convert(original);
canvas.showImage(frame);
showtimes++;
if(testtimes>=60){
grabber.close();
canvas.dispose();
return true;
}
if(showtimes>=1800){
grabber.close();
canvas.dispose();
return false;
}
Thread.sleep(30);//30刷新一個圖像
}
} catch (Exception | FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
}
pom文件如下:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>