是不是经常看见python程序猿玩高科技,人脸识别什么听起来好像很高大上?看完这篇你再也不用吵着学python了,java也可以玩高科技,人脸识别我们也很在行!
现在比较流行的一个开源人脸识别框架是opencv,人脸识别的话有两种,一种较为简单的xml建模,一种就是比较精确的dnn
opencv使用xml建模,识别度不高,然后侧脸无法识别,所以就想到了opencv dnn,网上搜索了很久,dnn基本没有java版本的,资料太少了,弄了一天,终于把这个java版本人脸识别写出来。
public class Test01{
public static void main(String[] args) {
//加载c++库
System.load(FileUtil.getAppicationPath() + File.separator + "libs\\opencv_java410.dll");
//加载识别文件,这两个东西在opencv-master\samples\dnn\face_detector文件里面有个download_weights.py,执行下就可以自动下载模型了
Net net = Dnn.readNetFromCaffe("E:\\workhome\\openct-test\\libs\\deploy.prototxt", "E:\\workhome\\openct-test\\libs\\res10_300x300_ssd_iter_140000_fp16.caffemodel");
//要识别的图片
Mat img = Imgcodecs.imread("E:\\workhome\\opencv-master\\samples\\dnn\\face_detector\\0.png");
// Mat mat = new Mat();
// Size size = new Size(300, 300);//统一尺寸 对比更好
// Imgproc.resize(img, mat, size);
//这里注意,当图片长宽小于300就会报错,所以需要判定图片大小
Mat inputBlob = Dnn.blobFromImage(img, 1.0f,
new Size(img.size().width ,img.size().height ),
new Scalar(124, 97, 113), false, false);
net.setInput(inputBlob);
Mat res = net.forward();
Mat faces = res.reshape(1, res.size(2));
System.out.println("faces" + faces);
float [] data = new float[7];
for (int i=0; i<faces.rows(); i++)
{
faces.get(i, 0, data);
float confidence = data[2];
if (confidence > 0.4f)
{
int left = (int)(data[3] * img.cols());
int top = (int)(data[4] * img.rows());
int right = (int)(data[5] * img.cols());
int bottom = (int)(data[6] * img.rows());
System.out.println("("+left + "," + top + ")("+right+","+bottom+") " + confidence);
Imgproc.rectangle(img, new Point(left,top), new Point(right,bottom), new Scalar(0,200,0), 3);
}
}
//生成的图片名字
Imgcodecs.imwrite("new.png", img);
BufferedImage img2paint = OpenCvUtil.mat2BI(img);
Myframe f = new Myframe();
f.setSize(img2paint.getWidth() + 200, img2paint.getHeight() + 200);
f.draw(img2paint);
}
}
话不多说,我们来看看效果!