【opencv】Java实现opencv 调用本地摄像头,实现人脸识别、人形识别、人眼识别
本博客为老魏原创,如需转载请留言咨询。
效果预览:(没办法,为了效果只能上像了,丑别介意。哈哈。。)
上代码:
1 package com.lw.test;
2
3 import java.awt.Graphics;
4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import java.awt.image.BufferedImage;
7
8 import javax.swing.JFrame;
9 import javax.swing.JPanel;
10 import javax.swing.WindowConstants;
11
12 import org.opencv.core.Core;
13 import org.opencv.core.Mat;
14 import org.opencv.core.MatOfDouble;
15 import org.opencv.core.MatOfRect;
16 import org.opencv.core.Point;
17 import org.opencv.core.Rect;
18 import org.opencv.core.Scalar;
19 import org.opencv.imgproc.Imgproc;
20 import org.opencv.ml.SVM;
21 import org.opencv.objdetect.CascadeClassifier;
22 import org.opencv.objdetect.HOGDescriptor;
23 import org.opencv.videoio.VideoCapture;
24 import org.opencv.videoio.Videoio;
25
26 public class CaptureBasic extends JPanel {
27
28 private BufferedImage mImg;
29
30 private BufferedImage mat2BI(Mat mat){
31 int dataSize =mat.cols()*mat.rows()*(int)mat.elemSize();
32 byte[] data=new byte[dataSize];
33 mat.get(0, 0,data);
34 int type=mat.channels()==1?
35 BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
36
37 if(type==BufferedImage.TYPE_3BYTE_BGR){
38 for(int i=0;i<dataSize;i+=3){
39 byte blue=data[i+0];
40 data[i+0]=data[i+2];
41 data[i+2]=blue;
42 }
43 }
44 BufferedImage image=new BufferedImage(mat.cols(),mat.rows(),type);
45 image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
46
47 return image;
48 }
49
50 public void paintComponent(Graphics g){
51 if(mImg!=null){
52 g.drawImage(mImg, 0, 0, mImg.getWidth(),mImg.getHeight(),this);
53 }
54 }
55
56 public static void main(String[] args) {
57 try{
58 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
59
60 Mat capImg=new Mat();
61 VideoCapture capture=new VideoCapture(0);
62 int height = (int)capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
63 int width = (int)capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
64 if(height==0||width==0){
65 throw new Exception("camera not found!");
66 }
67
68 JFrame frame=new JFrame("camera");
69 frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
70 CaptureBasic panel=new CaptureBasic();
71 panel.addMouseListener(new MouseAdapter() {
72 @Override
73 public void mouseClicked(MouseEvent arg0) {
74 System.out.println("click");
75 }
76 @Override
77 public void mouseMoved(MouseEvent arg0) {
78 System.out.println("move");
79
80 }
81 @Override
82 public void mouseReleased(MouseEvent arg0) {
83 System.out.println("mouseReleased");
84 }
85 @Override
86 public void mousePressed(MouseEvent arg0) {
87 System.out.println("mousePressed");
88 }
89 @Override
90 public void mouseExited(MouseEvent arg0) {
91 System.out.println("mouseExited");
92 //System.out.println(arg0.toString());
93 }
94 @Override
95 public void mouseDragged(MouseEvent arg0) {
96 System.out.println("mouseDragged");
97 //System.out.println(arg0.toString());
98 }
99
100 });
101 frame.setContentPane(panel);
102 frame.setVisible(true);
103 frame.setSize(width+frame.getInsets().left+frame.getInsets().right,
104 height+frame.getInsets().top+frame.getInsets().bottom);
105 int n=0;
106 Mat temp=new Mat();
107 while(frame.isShowing()&& n<500){
108 //System.out.println("第"+n+"张");
109 capture.read(capImg);
110 Imgproc.cvtColor(capImg, temp, Imgproc.COLOR_RGB2GRAY);
111 //Imgcodecs.imwrite("G:/opencv/lw/neg/back"+n+".png", temp);
112 panel.mImg=panel.mat2BI(detectFace(capImg));
113 panel.repaint();
114 //n++;
115 //break;
116 }
117 capture.release();
118 frame.dispose();
119 }catch(Exception e){
120 System.out.println("例外:" + e);
121 }finally{
122 System.out.println("--done--");
123 }
124
125 }
126 /**
127 * opencv实现人脸识别
128 * @param img
129 */
130 public static Mat detectFace(Mat img) throws Exception
131 {
132
133 System.out.println("Running DetectFace ... ");
134 // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
135 CascadeClassifier faceDetector = new CascadeClassifier("D:\\TDDOWNLOAD\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
136
137
138 // 在图片中检测人脸
139 MatOfRect faceDetections = new MatOfRect();
140
141 faceDetector.detectMultiScale(img, faceDetections);
142
143 //System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
144
145 Rect[] rects = faceDetections.toArray();
146 if(rects != null && rects.length >= 1){
147 for (Rect rect : rects) {
148 Imgproc.rectangle(img, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
149 new Scalar(0, 0, 255), 2);
150 }
151 }
152 return img;
153 }
154
155
156 /**
157 * opencv实现人型识别,hog默认的分类器。所以效果不好。
158 * @param img
159 */
160 public static Mat detectPeople(Mat img) {
161 //System.out.println("detectPeople...");
162 if (img.empty()) {
163 System.out.println("image is exist");
164 }
165 HOGDescriptor hog = new HOGDescriptor();
166 hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
167 System.out.println(HOGDescriptor.getDefaultPeopleDetector());
168 //hog.setSVMDetector(HOGDescriptor.getDaimlerPeopleDetector());
169 MatOfRect regions = new MatOfRect();
170 MatOfDouble foundWeights = new MatOfDouble();
171 //System.out.println(foundWeights.toString());
172 hog.detectMultiScale(img, regions, foundWeights);
173 for (Rect rect : regions.toArray()) {
174 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);
175 }
176 return img;
177 }
178
179 }
【opencv】Java实现opencv 调用本地摄像头,实现人脸识别、人形识别、人眼识别的更多相关文章
- H5混合开发二维码扫描以及调用本地摄像头
今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...
- 调用本地摄像头拍照(H5和画布)
关于H5 和 画布 调用本地摄像头拍照功能的实现 1.代码的实现(html部分) <input type="button" title="开启摄像头" v ...
- 利用html5调用本地摄像头拍照上传图片[转]
利用html5调用本地摄像头拍照上传图片 html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头, ...
- java命令行调用本地文件协议hikvideoclient://
最近在做一个视频项目,项目中需要通过调用海康本地协议打开视频播放器,起初尝试通过Process/ProcessBuilder无解,因为这个是调用本地应用程序的. 我要调用的是本地伪协议,最终通过一些研 ...
- HTML5调用本地摄像头画面,拍照,上传服务器
实现功能和适用业务 采集本地摄像头获取摄像头画面,拍照保存,上传服务器: 前端上传图片处理,展示,缩小,裁剪,上传服务器 实现步骤 调取本地摄像头(getUserMedia)/上传图片,将图片/视频显 ...
- 调用本地摄像头并通过canvas拍照
首先我们需要新建一个video标签,并且放到html里边 var video = document.createElement("video"); video.autoplay=& ...
- 前端调用本地摄像头实现拍照(vue)
由于调用摄像头有使用权限,只能在本地运行,线上需用https域名才可以使用. <template> <div class="camera_outer"> & ...
- 利用html5调用本地摄像头拍照上传图片
这个是前台HTML的代码. <div id="contentHolder"> <video id="video" width="32 ...
- H5实现调用本地摄像头实现实时视频以及拍照功能
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
随机推荐
- centos命令上传
首先安装 lrzsz # yum -y install lrzsz 运行 rz 命令: 在弹出的窗口选择需要上传的文件,文件会被上传至对应的目录下 运行 sz file.name 在弹出的窗口选择保存 ...
- FTP操作/Passive/Active控制
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 using ...
- swing实现QQ登录界面1.0( 实现了同一张图片只加载一次)、(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件)
swing实现QQ登录界面1.0( 实现了同一张图片只加载一次).(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件) 代码思路分析: 1.(同一张图片仅仅需要加载一次就够了,下 ...
- Cai Xukun and Orz Pandas Gym - 102309C
题目链接:https://vjudge.net/problem/Gym-102309C 题意:给定蔡徐坤投篮的位置和篮筐的位置以及最大初速度,求一个初速度和时间. 思路:一开始我以为要用到二分,后面仔 ...
- Java开发工程师面试-基础
JDK.JRE.JVM有什么区别? JDK:Java Development Kit 针对Java程序员的产品 JRE:Java Runtime Environment是运行Java的环境集合 JVM ...
- SVN讲解
1.SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复到已经删除的文件 2.SVN和Git相比,有什么优势? 使用简单,上手快 git没有目录级权限控 ...
- java面试-集合类不安全问题及解决方案
一.List 1.代码演示 public class ArrayListNotSafeDemo { public static void main(String[] args) { List<S ...
- 2020.1 PyCharm 激活
1 下载安装 平台windows,官网: 选路径后, 选项分别是64位的快捷方式,添加运行目录到环境变量PATH,添加右键菜单"打开文件夹作为一个工程",python文件关联,按需 ...
- Day14_75_反射(reflect)
反射 反射的基本概念 反射是由Smith在1982年首次提出,主要是指程序可以访问,检测,修改它本身状态或行为的一种能力.并且能够根据自身行为的状态或结果,调整和修改所描述行为的状态和相关语义. ja ...
- Prometheus【node_exporter】+grafana监控云主机
下面说一下这个开源软件的安装实践过程,目标如下: 在监控服务器上安装prometheus 在被监控环境上安装exporter 安装grafana 在监控服务器上安装prometheus 开始安装pro ...