java 使用opencv调用本地摄像头显示在swing panel中 实现人脸识别
首先给上效果图 ,程序启动后opencv调用摄像头获取图像信息显示在Jpanel
输入身份证号点击人脸采集按钮,开始采集人脸,采集到人脸后保存到文件夹
采集成功后在文件夹可查询采集成功的人脸图片,后续根据自己业务使用
开发步骤
1.首先下载opencv,我下载的是opencv-3.2.0-vc14,
下载地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.2.0/opencv-3.2.0-vc14.exe/download
下载后安装
2.找到安装目录,找到java的jar 需要导入到你的java项目
3.根据你的操作系统位数选择相应的opencv动态库复制到你程序运行的jdk下
复制opencv_java320.dll到jdk bin目录下
4.我的项目结构
5.核心代码
//begin
package com.xxxx.face.faceUtil;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.util.Map;
public class FaceUtil {
public BufferedImage mat2BI(Mat mat){
int dataSize =mat.cols()*mat.rows()*(int)mat.elemSize();
byte[] data=new byte[dataSize];
mat.get(0, 0,data);
int type=mat.channels()==1?
BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
if(type==BufferedImage.TYPE_3BYTE_BGR){
for(int i=0;i<dataSize;i+=3){
byte blue=data[i+0];
data[i+0]=data[i+2];
data[i+2]=blue;
}
}
BufferedImage image=new BufferedImage(mat.cols(),mat.rows(),type);
image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
return image;
}
/**
* opencv实现人脸识别
* @param img
*/
public static Mat detectFace(Map cacheMap,Mat img, int count) throws Exception
{
// System.out.println("Running DetectFace ... ");
// 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
//不能使用中文路径
CascadeClassifier faceDetector = new CascadeClassifier("G:\\workSoft\\opencv\\window\\installPack\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
// 在图片中检测人脸
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(img, faceDetections);
//System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
Rect[] rects = faceDetections.toArray();
//输入了身份证号在采集人脸
JTextField jTextField_sfzh=(JTextField)cacheMap.get("jTextField_sfzh");
boolean collectFace=cacheMap.get("collectFace")==null?false:(boolean)cacheMap.get("collectFace");
String sfzh=jTextField_sfzh.getText();
if(!collectFace){
return img;
}
if(rects != null && rects.length >= 1){
System.out.println("sfzh:"+sfzh+" count:"+count+" if(rects != null && rects.length >= 1) --> true 监测到人脸 ");
// Imgcodecs.imwrite("G:\\workSoft\\opencv\\faceImage\\face"+count+".png", img);
Imgcodecs.imwrite("G:\\workSoft\\opencv\\faceImage\\"+sfzh+"_face.png", img);
for (Rect rect : rects) {
Imgproc.rectangle(img, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 0, 255), 2);
}
//采集完成
cacheMap.put("collectFace",false);
//窗口显示人脸采集成功
JFrame jf=(JFrame) cacheMap.get("jf");
JOptionPane.showMessageDialog(jf, "身份证号:"+sfzh+"人脸采集成功!","提示",JOptionPane.INFORMATION_MESSAGE);
}
return img;
}
}
//end
项目源码已上传到csdn,opencv安装包也打包进去了,需要的小伙伴可以下载,使用idea+jdk1.8开发的java项目,直接可以运行的
下载地址:https://download.csdn.net/download/qq445829096/11249007