openCV java(JFrame) 实现人脸识别,人脸自动检测,自动保存裁剪后人脸
2017-11-25 18:42
1151 查看
基于Win10,调用系统摄像头
下载opencv下载地址
本文版本为opencv-2413, IDE为idea ;
安装之后将{$opencv}/build/java 下的jar包及对应的dll加载到library
将{$opencv}/sources/data/haarcascades 下面的人脸识别文件放到resources目录下面
下面是具体实现:
import java.awt.EventQueue; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import org.opencv.core.*; import org.opencv.highgui.Highgui; import org.opencv.highgui.VideoCapture; import org.opencv.objdetect.CascadeClassifier; public class CameraBasic { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } private JFrame frame; private static JLabel label; private static int faceSerialCount = 0; private static int flag = 0; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { CameraBasic window = new CameraBasic(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); VideoCapture camera = new VideoCapture();//创建Opencv中的视频捕捉对象 camera.open(0);//open函数中的0代表当前计算机中索引为0的摄像头,如果你的计算机有多个摄像头,那么一次1,2,3…… if (!camera.isOpened()) {//isOpened函数用来判断摄像头调用是否成功 System.out.println("Camera Error");//如果摄像头调用失败,输出错误信息 } else { Mat frame = new Mat();//创建一个输出帧 while (flag == 0) { camera.read(frame);//read方法读取摄像头的当前帧 CascadeClassifier faceDetector = new CascadeClassifier("src/main/resources/lbpcascade_frontalface.xml"); MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(frame, faceDetections); if (faceDetections.toArray().length > 0) { System.out.println(String.format("Detected %s faces ", faceDetections.toArray().length)); } Rect rectCrop = null; for (Rect rect : faceDetections.toArray()) { Core.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 255, 0)); rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height); if (rect.width + rect.height > rectCrop.height + rectCrop.width) { rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height); } } //转换图像格式并输出 label.setIcon(new ImageIcon(mat2BufferedImage.matToBufferedImage(frame))); try { Thread.sleep(500);//线程暂停500ms } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } int faceCount = faceDetections.toArray().length; if (faceCount > 0) { faceSerialCount++; System.out.println(faceSerialCount); } else { faceSerialCount = 0; } if (faceSerialCount > 6) { Mat imageRoi = new Mat(frame, rectCrop); Highgui.imwrite("haha.png", imageRoi); faceSerialCount = 0; } } } } private CameraBasic() { initialize(); } private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 800, 450); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null); label = new JLabel(""); label.setBounds(0, 0, 800, 450); frame.getContentPane().add(label); } }
mat2BufferedImage.java
import org.opencv.core.Mat; import java.awt.image.BufferedImage; public class mat2BufferedImage { public static BufferedImage matToBufferedImage(Mat matrix) { int cols = matrix.cols(); int rows = matrix.rows(); int elemSize = (int) matrix.elemSize(); byte[] data = new byte[cols * rows * elemSize]; int type; matrix.get(0, 0, data); switch (matrix.channels()) { case 1: type = BufferedImage.TYPE_BYTE_GRAY; break; case 3: type = BufferedImage.TYPE_3BYTE_BGR; // bgr to rgb byte b; for (int i = 0; i < data.length; i = i + 3) { b = data[i]; data[i] = data[i + 2]; data[i + 2] = b; } break; default: return null; } BufferedImage image2 = new BufferedImage(cols, rows, type); image2.getRaster().setDataElements(0, 0, cols, rows, data); return image2; } }
相关文章推荐
- Java使用OpenCV实现人脸识别/人眼检测/图片截取/合成/添加水印
- QT+opencv实现人脸检测并提取裁剪
- QT+Opencv实现人脸检测与性别识别(1)
- JAVA应用JNI调用OpenCV实现人脸检测(1)
- QT+Opencv实现人脸检测与性别识别(2)
- OpenCV结合V4l2实现人脸检测以及人脸识别
- Java+opencv3.2.0实现人脸检测功能
- 【图像识别】 Python+Opencv调用摄像头实现人脸识别并保存视频
- JAVA应用JNI调用OpenCV实现人脸检测(2)--原创
- Android使用OpenCV实现「人脸检测」和「人脸识别」
- 【opencv】Java实现opencv 调用本地摄像头,实现人脸识别、人形识别、人眼识别
- Android使用OpenCV实现「人脸检测」和「人脸识别」
- JAVA应用JNI调用OpenCV实现人脸检测
- TensorFlow实现人脸识别(2)------利用opencv在视频中识别人脸并且保存
- VS2010+Opencv2.4.4+MFC实现人脸检测与识别
- JAVA应用JNI调用OpenCV实现人脸检测
- JAVA应用JNI调用OpenCV实现人脸检测(1)
- Linux系统下利用OpenCV实现人脸检测和基于LBPH算法的人脸识别
- 代码C++, opencv实现人脸识别,人脸检测,人脸匹配,视频中的人脸检测,摄像头下的人脸检测等
- java+opencv+intellij idea实现人脸识别