社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
刚刚接触这个网上资料也少,自己收集的,看着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;
}
}
效果图:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!