javacv最新版本人脸检测和对比,对比度不高。

1 篇文章 0 订阅

刚刚接触这个网上资料也少,自己收集的,看着opencv写的。所有jar包:javavc所有jar包连接

1.导入javacv包最新版本不需要opencv只需要导入ffmpeg-windows-x86_64.jar,ffmpeg.jar,javacpp.jar,javacv.jar ,opencv-windows-x86_64.jar ,opencv.jar 。导入这些就ok。
2.opencv-windows-x86_64.jar ,ffmpeg-windows-x86_64.jar。根据自己电脑对应版本进行选择。
3.直接复制就好懒的写了。
4.haarcascade_frontalface_alt.xml代码里面的文件下载地址::::haarcascade_frontalface_alt.xml下载连接:
5,代码有不足地方希望大家建议,谢谢。

import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.opencv_objdetect.CascadeClassifier;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameGrabber;

/*
 * 
 * 
 */
public class CameraCapture {
			public static void main(String[] args) {
				try {
					TurnOnTheCamera();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			static void TurnOnTheCamera() throws Exception{
					OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(1);
					grabber.setImageWidth(300);  
				    grabber.setImageHeight(300); 
					CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
			        canvas.setLayout(null);
					canvas.setAlwaysOnTop(true);
	   				Font font= new Font("微软雅黑", Font.BOLD, 15);
	   			         JButton jButton = new JButton("确认上传");
	   			         JButton jButton1 = new JButton("继续拍照");
	   			         jButton1.setEnabled(false);
	   			         JButton jButton2 = new JButton("关闭");
	   			         jButton.setFont(font);
	   			         jButton1.setFont(font);
	   			         jButton2.setFont(font);
	   			         jButton.setBounds(0, 300, 100, 50);
	   			         jButton1.setBounds(120, 300, 100, 50);
	   			         jButton2.setBounds(240, 300,100, 50);
	   			         canvas.add(jButton);
	   			         canvas.add(jButton1);
	   			         canvas.add(jButton2);
	   			        jButton.addActionListener(new ActionListener() {
	   										@Override
	   										public void actionPerformed(ActionEvent e) {
	   											// TODO Auto-generated method stub
	   											
	   										}
	   					});
	   			        jButton1.addActionListener(new ActionListener() {
							
							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								
							}
						});
	   			        jButton2.addActionListener(new ActionListener() {
							
							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								
							}
						});
	   			     camerThread camerThread = new camerThread(canvas,grabber);
	   			     camerThread.start();
					}
}
class camerThread extends Thread{
			static	int x = 0,y=0,width=0,height=0;
			private volatile static boolean stop = true;
			private volatile static  boolean stop3= true;
			private static  OpenCVFrameGrabber grabber;
			int i=0;
			static CascadeClassifier face_cascade = new CascadeClassifier(
	 				"D:\\haarcascade_frontalface_alt.xml");
			private	CanvasFrame canvas;
			public camerThread(CanvasFrame canvas,OpenCVFrameGrabber grabber) {
				// TODO Auto-generated constructor stub
						camerThread.grabber =grabber;
						this.canvas=canvas;
			}
			@Override
			public void run() {
				// TODO Auto-generated method stu
					try {
							 grabber.start(); //开始获取摄像头数据
							 while(stop) {
								 		if(stop3){
								 						canvas.setSize(500, 500);
								 						Frame f = detectFace1(grabber.grab());
								 						canvas.showImage(f);
								 		}else {
								 		//	Frame  hh= detectFace2(grabber.grab());
								 					canvas.showImage(grabber.grab());
								 					stop3=true;
								 		}
							 }
					} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					}  
			}
			 public static Frame detectFace1(Frame frame) throws InterruptedException, Exception{
						OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
				 		Mat mat = converter.convertToMat(frame);
				 		Mat videoMatGray = new Mat();
				 		cvtColor(mat, videoMatGray, COLOR_BGRA2GRAY);
				 		RectVector faces = new RectVector();//创建用来装检测出来的人脸的容器
				 		face_cascade.detectMultiScale(videoMatGray, faces);//检测人脸,grayscr为要检测的图片,faces用来存放检测结果
				 		for (int i = 0; i < faces.size(); i++) {//遍历检测出来的人脸
				 				if(0==i) {
				 							Rect face_i = faces.get(i);
				 							rectangle(mat, face_i, new Scalar(0, 255, 0, 1));
				 							x = face_i.tl().x();
				 							y = face_i.tl().y(); 
				 							width=face_i.width();
				 							height=face_i.height();
				 							System.out.println("脸长:" + face_i.width() + ",脸宽:" + face_i.height());
				 							if(0!=x&&0!=width&&0!=height&&0!=y) {
				 										Rect rect = new Rect(x, y, width, height);
				 										Mat sub = new Mat(mat,rect);//截取的人脸
				 										Size size=new Size(200, 200);
				 										Mat resize = new Mat();
				 										resize(sub, resize,size);
				 										double in = CmpPic(resize);
				 										if(1.0==in) {
				 											stop3=false;
				 											System.out.println("成功");
				 											Thread.sleep(10000);							
				 										}else {
				 											System.out.println("失败");
														}
				 									}
				 				}
				 	}
				 		Frame	frame1= converter.convert(mat);
				        System.gc();
				     	return frame1;
			    }
				public static double CmpPic(Mat src) throws InterruptedException {
					Mat src1 = opencv_imgcodecs.imread("D:\\img2\\1.png");
					Mat r_hist=new Mat();
					Mat g_hist=new Mat();
		    		Mat hsrc=new Mat();
		    		Mat hsrc1=new Mat();
				System.out.println("\n==========直方图比较==========");
				//相关性阈值,应大于多少,越接近1表示越像,最大为1
				double HISTCMP_CORREL_THRESHOLD = 0.90;
				//卡方阈值,应小于多少,越接近0表示越像
				double HISTCMP_CHISQR_THRESHOLD =0.5;
				//交叉阈值,应大于多少,数值越大表示越像
				double HISTCMP_INTERSECT_THRESHOLD = 2.5;
				//巴氏距离阈值,应小于多少,越接近0表示越像
				double HISTCMP_BHATTACHARYYA_THRESHOLD = 0.2;
				// HSV
				int channels[] = {0 , 1};
				int h_bins = 50; int s_bins = 60; int v_bins = 60;     
				int histSize[] = { h_bins, s_bins, v_bins};
				float range[] = {  0,255,0, 180 } ;
				//
				cvtColor(src, hsrc,CV_BGR2HSV  );
				cvtColor(src1, hsrc1, CV_BGR2HSV  );
				calcHist(hsrc, 1, channels, new Mat(), r_hist, 1, histSize, range, true, false);
				calcHist(hsrc1, 1,channels, new Mat(), g_hist, 1, histSize, range, true, false);
				normalize(r_hist, r_hist, 0, 1, NORM_MINMAX, -1,new Mat());
				normalize(g_hist, g_hist, 0, 1,NORM_MINMAX, -1,new Mat());
				double result0, result1, result2, result3;
				result0 = compareHist(g_hist, r_hist, HISTCMP_CORREL);
				result1 = compareHist(g_hist, r_hist, HISTCMP_CHISQR);
				result2 =compareHist(g_hist, r_hist, HISTCMP_INTERSECT);
				result3 =compareHist(g_hist, r_hist,HISTCMP_BHATTACHARYYA);
				System.out.println("相关性(度量越高,匹配越准确 [基准:"+HISTCMP_CORREL_THRESHOLD+"]),当前值:" + result0);
				System.out.println("卡方(度量越低,匹配越准确 [基准:"+HISTCMP_CHISQR_THRESHOLD+"]),当前值:" + result1);
				System.out.println("交叉核(度量越高,匹配越准确 [基准:"+HISTCMP_INTERSECT_THRESHOLD+"]),当前值:" + result2);
				System.out.println("巴氏距离(度量越低,匹配越准确 [基准:"+HISTCMP_BHATTACHARYYA_THRESHOLD+"]),当前值:" + result3);
				//一共四种方式,有三个满足阈值就算匹配成功
				int count = 0;
				if (result0 > HISTCMP_CORREL_THRESHOLD)
					count++;
				if (result1 < HISTCMP_CHISQR_THRESHOLD)
					count++;
				if (result2 > HISTCMP_INTERSECT_THRESHOLD)
					count++;
				if (result3 < HISTCMP_BHATTACHARYYA_THRESHOLD)
					count++;
				int retVal = 0;
				if (count >=1) {
					//这是相似的图像
				retVal = 1;
				Voice.Voice1();
				System.out.println("----------------------------====================-----相似");
				}
				return retVal;
			}
}

效果图:在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【javacv-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【javacv-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【javacv-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【javacv-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【javacv-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【javacv-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: javacv-***.jar中文-英文对照文档.zip,java,javacv-***.jar,org.bytedeco,javacv,***,cl.eye,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bytedeco,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【javacv-***.jar中文-英文对照文档.zip】,再解压其中的 【javacv-***-javadoc-API文档-中文(简体)-英语-对照版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'org.bytedeco', name: 'javacv', version: '***' Gradle (Short): implementation 'org.bytedeco:javacv:***' Gradle (Kotlin): implementation("org.bytedeco:javacv:***") ``` # 含有的 Java package(包): ``` cl.eye org.bytedeco.javacv ``` # 含有的 Java class(类)(此处仅列举3个): ``` cl.eye.CLCamera org.bytedeco.javacv.AndroidFrameConverter org.bytedeco.javacv.BaseChildSettings ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值