AI:OPENCV实现人脸的自动识别
2024-10-01 16:38:24
依赖jar包:
faceRecognition.java
package opencv; import java.awt.Graphics;
import java.awt.image.BufferedImage; import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants; import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDouble;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.objdetect.HOGDescriptor;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio; @SuppressWarnings("serial")
public class faceRecognition extends JPanel { private BufferedImage mImg; private 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;
} public void paintComponent(Graphics g) {
if (mImg != null) {
g.drawImage(mImg, 0, 0, mImg.getWidth(), mImg.getHeight(), this);
}
} public static void main(String[] args) {
try {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat capImg = new Mat();
VideoCapture capture = new VideoCapture(0);
int height = (int) capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
int width = (int) capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
if (height == 0 || width == 0) {
throw new Exception("未发现摄像头!");
} // 创建jframe
JFrame frame = new JFrame("摄像头");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
faceRecognition panel = new faceRecognition();
// 添加鼠标监听器
// panel.addMouseListener(new MouseAdapter() {
// @Override
// public void mouseClicked(MouseEvent arg0) {
// System.out.println("鼠标点击");
// }
//
// @Override
// public void mouseMoved(MouseEvent arg0) {
// System.out.println("鼠标移开");
//
// }
//
// @Override
// public void mouseReleased(MouseEvent arg0) {
// System.out.println("鼠标释放");
// }
//
// @Override
// public void mousePressed(MouseEvent arg0) {
// System.out.println("鼠标按下");
// }
//
// @Override
// public void mouseExited(MouseEvent arg0) {
// System.out.println("鼠标出界");
// // System.out.println(arg0.toString());
// }
//
// @Override
// public void mouseDragged(MouseEvent arg0) {
// System.out.println("mouseDragged");
// // System.out.println(arg0.toString());
// }
// });
frame.setContentPane(panel);
frame.setVisible(true);
frame.setSize(width + frame.getInsets().left + frame.getInsets().right,
height + frame.getInsets().top + frame.getInsets().bottom);
int n = 1;
Mat temp = new Mat();
// while (frame.isShowing() && n <= 500) {
while (frame.isShowing()) {
// System.out.println("第" + n + "张");
capture.read(capImg); // 载入图片
Imgproc.cvtColor(capImg, temp, Imgproc.COLOR_RGB2GRAY);
// Imgcodecs.imwrite("E:/opencv/wzg/picture_" + n + ".png", temp); // 存储图片到本地
panel.mImg = panel.mat2BI(detectFace(capImg)); // 调用人脸识别方法
panel.repaint();
// n++;
// break; // 识别500存入本地
}
capture.release();
frame.dispose();
} catch (Exception e) {
System.out.println("例外:" + e);
} finally {
System.out.println("--done--");
} } /**
* opencv实现人脸识别
*
* @param img
*/
public static Mat detectFace(Mat img) throws Exception { // System.out.println("开始人像识别 ... ");
// 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
CascadeClassifier faceDetector = new CascadeClassifier("E:\\my_dev\\haarcascade_frontalface_alt.xml"); // 在图片中检测人脸
MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(img, faceDetections); if (faceDetections.toArray().length == 0) {
// System.out.println("no face");
} else {
System.out.println(String.format("检测到 %s 个人像", faceDetections.toArray().length));
} Rect[] rects = faceDetections.toArray();
if (rects != null && rects.length >= 1) {
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);
}
}
return img;
} /**
* opencv实现人型识别,hog默认的分类器。所以效果不好。
*
* @param img
*/
public static Mat detectPeople(Mat img) {
// System.out.println("detectPeople...");
if (img.empty()) {
System.out.println("image is exist");
}
HOGDescriptor hog = new HOGDescriptor();
hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
System.out.println(HOGDescriptor.getDefaultPeopleDetector());
hog.setSVMDetector(HOGDescriptor.getDaimlerPeopleDetector());
MatOfRect regions = new MatOfRect();
MatOfDouble foundWeights = new MatOfDouble();
System.out.println(foundWeights.toString());
hog.detectMultiScale(img, regions, foundWeights);
for (Rect rect : regions.toArray()) {
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);
}
return img;
} }
最新文章
- web前端开发学习路径图
- 利用微软AntiXss Library过滤输出字符,防止XSS攻击
- JS-改变页面的颜色(二)
- 用Wireshark提取WPA握手包
- 如何用sql批量删除一个id段内的dedecms文章?
- XHTML标签的嵌套规则--很基础很重要
- ADT 怎么删除logcat过滤规则
- DataTables获取表单输入框数据
- 《Java程序员面试笔试宝典》之Static关键字有哪些作用
- Hyper-v 安装CentOS
- 1620: [Usaco2008 Nov]Time Management 时间管理
- codeforces 258D
- Git~GitLab当它是一个CI工具时
- WebGL three.js学习笔记 创建three.js代码的基本框架
- PostgreSQL自学笔记:9 索引
- 爬虫-----selenium模块自动爬取网页资源
- ROS进阶学习手记 7 -- RViz仿真实例1
- MySQL主从同步详细步骤
- 取消Fetch API请求
- ROS知识(2)----理解ROS系统结构
热门文章
- leetcode 刷题之路 66 Path Sum II
- vim 插件之solarized
- P 值(p value)与统计检验
- rest_framework 分页三种
- Matlab函数编译成dll供c调用
- Sql 问题---在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不足
- Python的matplotlib库画图不能显示中文问题解决
- The Future Of ReactiveCocoa by Justin Spahr-Summers
- 如何知道 CPU 是否支持虚拟化技术(VT)
- 运行npm start vue.js项目 出现 npm ERR! missing script: start 错误