import staticorg.bytedeco.javacpp.opencv_imgproc.COLOR_BGRA2GRAY;import staticorg.bytedeco.javacpp.opencv_imgproc.cvtColor;import staticorg.bytedeco.javacpp.opencv_imgproc.rectangle;import staticorg.bytedeco.javacpp.opencv_imgproc.resize;importjavax.swing.JFrame;importorg.bytedeco.javacpp.opencv_core.Mat;importorg.bytedeco.javacpp.opencv_core.Rect;importorg.bytedeco.javacpp.opencv_core.RectVector;importorg.bytedeco.javacpp.opencv_core.Scalar;importorg.bytedeco.javacpp.opencv_core.Size;importorg.bytedeco.javacpp.opencv_imgcodecs;importorg.bytedeco.javacpp.opencv_objdetect.CascadeClassifier;importorg.bytedeco.javacv.CanvasFrame;importorg.bytedeco.javacv.Frame;importorg.bytedeco.javacv.FrameGrabber.Exception;importorg.bytedeco.javacv.OpenCVFrameConverter;importorg.bytedeco.javacv.OpenCVFrameGrabber;/*** 调用本地摄像头窗口视频
*
*@authoreguid
*@version2016年6月13日
*@seejavavcCameraTest
*@sincejavacv1.2*/
public classFaceDetect {public static void main(String[] args) throwsException, InterruptedException {//里面的整数值代表第N个摄像头,电脑内置默认为0,外置的从1开始
OpenCVFrameConverter.ToMat converterToMat = newOpenCVFrameConverter.ToMat();
OpenCVFrameGrabber grabber= new OpenCVFrameGrabber(0);
grabber.start();//开始获取摄像头数据
CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
Frame videoFrame= null;
Mat videoMat= null;while (true) {if (!canvas.isDisplayable()) {//窗口是否关闭
grabber.stop();//停止抓取
grabber.close();
System.exit(2);//退出
}//获取摄像头图像并放到窗口上显示, 这里的Frame是一帧视频图像
videoFrame =grabber.grab();
videoMat=converterToMat.convert(videoFrame);
Mat videoMatGray= newMat();//图片灰度处理,更容易识别出人脸
cvtColor(videoMat, videoMatGray, COLOR_BGRA2GRAY);
Mat detectFace=detectFace(videoMat);
videoFrame=converterToMat.convert(detectFace);
canvas.showImage(videoFrame);//显示带方框的人脸
Thread.sleep(50);//50毫秒刷新一次图像
}
}/*** 人脸检测
*
*@paramvideoMat
*@return*@throwsException*/
public static Mat detectFace(Mat videoMat) throwsException {
System.out.println("Running DetectFace ... ");//从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
CascadeClassifier faceDetector = newCascadeClassifier("D:\\app\\opencv3.4.2\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");//在图片中检测人脸
RectVector faces = newRectVector();
faceDetector.detectMultiScale(videoMat, faces);
System.out.println(String.format("Detected %s faces", faces.size()));
Rect[] rects=faces.get();if (rects != null && rects.length >= 1) {for(Rect rect : rects) {
rectangle(videoMat, rect, Scalar.RED);
saveFace(videoMat, rect);
}
}
faceDetector.close();returnvideoMat;
}/*** 抓取人脸保存为图片
*
*@paramimage
*@paramrect*/
private static voidsaveFace(Mat image, Rect rect) {
Mat sub= image.rowRange(rect.y(), rect.y() + rect.height()).colRange(rect.x(), rect.x() +rect.width());
Mat mat= newMat();
Size size= new Size(100, 100);
resize(sub, mat, size);
opencv_imgcodecs.imwrite("d:\\test\\capture\\" + System.currentTimeMillis() + ".png", mat);
}
}