Java实现人脸检测,Java数据库题目大全
切莫死记硬背,小心面试官直接让你出门右拐1000道互联网Java面试题:Java高级架构面试知识整理:涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:**(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
func为实现人脸相关 需要zi料+ 绿色徽【vip1024b】
接口
image存放的为测试用图片
tmp为测试使用输出图片。
lib里包含opencv的使用jar包和本地dll库。
工程导入完成之后,需要配置对应的jar包以及修改JDK。
IDEA的话通过file->Project Structure进行设置。选中加号,选择外部jar包引用。选择工程里lib目录下的openCV343.jar。
之后重新编译。看是否报错。没有报错的话项目导入成功
2、代码实现
1、DetectFace
package com.facedetect.func;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
/**
-
@Auther: DarkKing
-
@Date: 2019/10/2 11:06
-
@Description:
*/
public class DetectFace {
//定义程序的基础路径
private String basePath =System.getProperty(“user.dir”);
//人眼识别分类器路径
private String eyeConfigPath=basePath+“\src\com\facedetect\config\haarcascade_eye_tree_eyeglasses.xml”;
//人脸识别分类器路径
private String faceConfigPath=basePath+“\src\com\facedetect\config\haarcascade_frontalface_alt2.xml”;
static{
// 载入opencv的库
String opencvpath = System.getProperty(“user.dir”) + “\libs\x64\”;
String opencvDllName = opencvpath + Core.NATIVE_LIBRARY_NAME + “.dll”;
System.load(opencvDllName);
}
/**
-
opencv实现人脸识别
-
@param imagePath
-
@param outFile
-
@throws Exception
*/
public void detectFace(String imagePath, String outFile) throws Exception
{
System.out.println("Running DetectFace …,config path is "+faceConfigPath);
String basePath =System.getProperty(“user.dir”);
String path= basePath+ “\src\com\facedetect\tmp\”;
// 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中,为了方便从安装方便放到了程序路径里
CascadeClassifier faceDetector = new CascadeClassifier(faceConfigPath);
//创建图片处理对象
Mat image = Imgcodecs.imread(imagePath);
// 在图片中检测人脸
MatOfRect faceDetections = new MatOfRect();
//多条件结果检测
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format(“Detected %s faces”, faceDetections.toArray().length));
//检测结果集
Rect[] rects = faceDetections.toArray();
// 在每一个识别出来的人脸周围画出一个方框
for (int i = 0; i < rects.length; i++) {
Rect rect = rects[i];
Imgproc.rectangle(image, new Point(rect.x-2, rect.y-2),
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
Mat copy = new Mat(image,rect);
Mat temp = new Mat();
copy.copyTo(temp);
//输出图片
Imgcodecs.imwrite(path+i+“.png”, temp);
}
Imgcodecs.imwrite(outFile, image);
System.out.println(String.format(“人脸识别成功,人脸图片文件为: %s”, outFile));
}
/**
-
opencv实现人眼识别
-
@param imagePath
-
@param outFile
-
@throws Exception
*/
public void detectEye(String imagePath, String outFile) throws Exception {
System.out.println("Running DetectFace …,config path is "+eyeConfigPath);
CascadeClassifier eyeDetector = new CascadeClassifier(
eyeConfigPath);
Mat image = Imgcodecs.imread(imagePath); //读取图片
// 在图片中检测人脸
MatOfRect faceDetections = new MatOfRect();
eyeDetector.detectMultiScale(image, faceDetections, 2.0,1,1,new Size(20,20),new Size(20,20));
System.out.println(String.format(“Detected %s eyes”, faceDetections.toArray().length));
Rect[] rects = faceDetections.toArray();
if(rects != null && rects.length <2){
throw new RuntimeException(“不是一双眼睛”);
}
Rect eyea = rects[0];
Rect eyeb = rects[1];
System.out.println("a-中心坐标 " + eyea.x + " and " + eyea.y);
System.out.println("b-中心坐标 " + eyeb.x + " and " + eyeb.y);
//获取两个人眼的角度
double dy=(eyeb.y-eyea.y);
double dx=(eyeb.x-eyea.x);
double len=Math.sqrt(dxdx+dydy);
System.out.println("dx is "+dx);
System.out.println("dy is "+dy);
System.out.println("len is "+len);
double angle=Math.atan2(Math.abs(dy),Math.abs(dx))*180.0/Math.PI;
System.out.println("angle is "+angle);
for(Rect rect:faceDetections.toArray()) {
Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
- rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
Imgcodecs.imwrite(outFile, image);
System.out.println(String.format(“人眼识别成功,人眼图片文件为: %s”, outFile));
}
}
该函数主要实现了两个方法,一个是人脸检测,一个是人眼检测。方法都差不多。主要是加载的分类器不同。以及结果集的过滤。其中重要的一个方法时是MatOfRect的detectMultiScale方法。该方法共有7个参数。含义如下。
-
**参数1:**image–待检测图片,一般为灰度图像加快检测速度;
-
**参数2:**objects–被检测物体的矩形框向量组;
-
**参数3:**scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
-
**参数4:**minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框, 这种设定值一般用在用户自定义对检测结果的组合程序上;
-
**参数5:**flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为 CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域, 因此这些区 域通常不会是人脸所在区域;
-
**参数6、7:**minSize和maxSize用来限制得到的目标区域的范围。
2、ImageUtils
package com.facedetect.func;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
-
@Auther: DarkKing
-
@Date: 2019/10/2 11:12
-
@Description:
*/
public class ImageUtils {
/**
-
裁剪图片并重新装换大小
-
@param imagePath
-
@param posX
-
@param posY
-
@param width
-
@param height
-
@param outFile
*/
public static void imageCut(String imagePath,String outFile, int posX,int posY,int width,int height ){
//原始图像
Mat image = Imgcodecs.imread(imagePath);
//截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度
Rect rect = new Rect(posX,posY,width,height);
//两句效果一样
Mat sub = image.submat(rect); //Mat sub = new Mat(image,rect);
Mat mat = new Mat();
Size size = new Size(300, 300);
Imgproc.resize(sub, mat, size);//将人脸进行截图并保存
Imgcodecs.imwrite(outFile, mat);
System.out.println(String.format(“图片裁切成功,裁切后图片文件为: %s”, outFile));
}
/**
-
@param imagePath
-
@param outFile
*/
public static void setAlpha(String imagePath, String outFile) {
/**
-
增加测试项
-
读取图片,绘制成半透明
*/
try {
ImageIcon imageIcon = new ImageIcon(imagePath);
BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(),
imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
//循环每一个像素点,改变像素点的Alpha值
int alpha = 100;
for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
int rgb = bufferedImage.getRGB(j2, j1);
rgb = ( (alpha + 1) << 24) | (rgb & 0x00ffffff);
bufferedImage.setRGB(j2, j1, rgb);
}
}
g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
分享
首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:
(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
其次分享一些技术知识,以截图形式分享一部分:
Tomcat架构解析:
算法训练+高分宝典:
Spring Cloud+Docker微服务实战:
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
Java高级架构面试知识整理:
涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:**
(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
其次分享一些技术知识,以截图形式分享一部分:
Tomcat架构解析:
[外链图片转存中…(img-oaWxXvHZ-1710354900988)]
算法训练+高分宝典:
[外链图片转存中…(img-WCeOLMZh-1710354900989)]
Spring Cloud+Docker微服务实战:
[外链图片转存中…(img-kii5EoY9-1710354900989)]
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
[外链图片转存中…(img-O4fnndkG-1710354900990)]
Java高级架构面试知识整理:
[外链图片转存中…(img-oVARwsaV-1710354900990)]
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)