package com.javacv.openCv.controller;
import java.util.UUID;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class TestDemo {
/**
* 测试自带人脸识别,视频识别
* <p>Title: detectFace1</p>
* <p>Description: </p>
* @author 陈阳
* @date 2019年1月25日
* @throws org.bytedeco.javacv.FrameGrabber.Exception
* @throws InterruptedException
*/
public static void detectFace1() throws org.bytedeco.javacv.FrameGrabber.Exception, InterruptedException
{
//String file = "rtsp://admin:shuhai3218@192.168.31.106/h264/ch1/main/av_stream";
String file="rtmp://58.200.131.2:1935/livetv/hunantv";
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
//grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
grabber.setOption("fflags", "nobuffer"); //
// 一直报错的原因!!!就是因为是 2560 * 1440的太大了。。
grabber.setImageWidth(960);
grabber.setImageHeight(540);
System.out.println("grabber start");
grabber.start();
OpenCVFrameConverter.ToOrgOpenCvCoreMat convertToMat = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
//OpenCVFrameConverter.ToMat convert = new OpenCVFrameConverter.ToMat();
//加载检测器
org.opencv.objdetect.CascadeClassifier faceDetector = new org.opencv.objdetect.CascadeClassifier("F:\\openCV\\openCv\\target\\classes\\haarcascade_frontalface_alt2.xml");//初始化人脸检测器
String path=Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1).replace("/", "\\\\");
//未关闭就一直向窗口刷新图片。就是视频
while (true) {
//System.err.println("五五五五五");
Frame frame = grabber.grab();
//获取当前帧图片
org.opencv.core.Mat image1 = convertToMat.convert(frame);
if(image1==null||image1.empty()) {
continue;
}
Long str=image1.nativeObj;
image1=null;
frame=null;
/*final Mat openmat = convert.convert(frame);
if(openmat==null||openmat.empty()) {
continue;
}*/
CommenUtils.getConPool().execute(
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
org.opencv.core.Mat image=new org.opencv.core.Mat(str);
if (image==null||image.empty())
return;
MatOfRect faceDetections = new MatOfRect();
// 进行人脸检测
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("检测到人脸: %s", faceDetections.toArray().length));
String ranstr=UUID.randomUUID().toString();
if(faceDetections.toArray().length>0) {
try {
//imwrite(path+"text.png", openmat);
Imgcodecs.imwrite(path+ranstr+".png", image);
}catch(Exception e) {
e.printStackTrace();
}
}
Integer i = 1;
// 制图将图填充到image中
for (org.opencv.core.Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0), 3);
imageCut1(image, ranstr+"-"+i+".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪
i++;
}
//str=null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread.sleep(100);//100毫秒刷新一次图像
}
}
public static void imageCut1(org.opencv.core.Mat image, String outFile, int posX, int posY, int width, int height) {
// 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度
org.opencv.core.Rect rect = new org.opencv.core.Rect(posX, posY, width, height);
// 两句效果一样
org.opencv.core.Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);
org.opencv.core.Mat mat = new org.opencv.core.Mat();
Size size = new Size(width, height);
Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存
Imgcodecs.imwrite(outFile, mat);
System.out.println(String.format("图片裁切成功,裁切后图片文件为: %s", outFile));
}
}