基於Java簡單的人臉和人眼識別程序
使用這個程序之前必須先安裝配置OpenCV詳細教程見:https://www.cnblogs.com/prodigal-son/p/12768948.html
注意:
D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/*前面這部分地址是看你存放的位置決定的*/sources/data/haarcascades/haarcascade_frontalface_alt.xml/*后面的地址不變固定在這個地方*/
package faceDistinguish2;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
/**
* 基於openc的人臉識別
* @author Ocean
*
*/
public class FaceID {
/**
* OpenCV人臉識別
* @param rgb
* @param gray
*/
public static void faceRecognition(Mat rgb, Mat gray) {
// 讀取OpenCV的人臉特征識別文件
CascadeClassifier cascade = new CascadeClassifier("D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
//在路徑上沒有找到相關文件返回1
if (cascade.empty()) {
System.out.println("人臉識別文件讀取失敗");
//return;
}
MatOfRect rect = new MatOfRect();
//檢測人臉
cascade.detectMultiScale(gray, rect);
// 為每張識別到的人臉畫一個圈
for (Rect re : rect.toArray()) {
Imgproc.rectangle(rgb, new Point(re.x, re.y), new Point(re.x+ re.width, re.y + re.height), new Scalar(0, 0, 255));
}
//圖形界面顯示
HighGui.imshow("人臉識別", rgb);
}
/**
* OpenCV人眼識別
* @param rgb
* @param gray
*/
public static void eyeRecognition(Mat rgb, Mat gray) {
// 讀取OpenCV的人眼特征識別文件
CascadeClassifier cascade = new CascadeClassifier("D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml");
if (cascade.empty()) {
System.out.println("人眼識別文件讀取失敗");
return;
}
MatOfRect rect = new MatOfRect();
cascade.detectMultiScale(gray, rect);
for (Rect re : rect.toArray()) {
Imgproc.rectangle(rgb, new Point(re.x, re.y), new Point(re.x+ re.width, re.y + re.height), new Scalar(255, 0, 0));
}
// HighGui.imshow("人臉識別", rgb);
}
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 實例化相機
VideoCapture videoCapture = new VideoCapture();
// 如果要從攝像頭獲取視頻 則要在 VideoCapture 的構造方法寫 0
if (!videoCapture.open(0)) {
System.out.println("相機打開失敗");
return;
}
while (true) {
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);
faceRecognition(img, gray);
eyeRecognition(img, gray);
HighGui.waitKey(10);
}
}
}
程序效果
如果在運行完成關閉圖形窗口后再次運行出現下面這種錯誤是因為程序還沒有結束
解決辦法是點擊下面這個除去啟動
再點擊終止就解決這個問題了
以后關閉圖形界面后就點擊終止按鈕或者直接點擊終止按鈕就可以終止程序了