javacv最新版本人脸检测和对比,对比度不高。 - Go语言中文社区

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


刚刚接触这个网上资料也少,自己收集的,看着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;
			}
}

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42865331/article/details/88865293
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-06 10:50:18
  • 阅读 ( 2106 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢