当前位置: 首页 > news >正文

JavaCV

文章目录

  • 调用摄像头
  • 录制视频
  • 录制带音频的视频
  • 人脸识别
  • 人脸64关键点

调用摄像头

public class Camera {


    public static void main(String[] args) throws FrameGrabber.Exception {
        // 开启抓取器
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();
        // 开启窗口
        CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
        canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        // 设置窗口大小
        canvasFrame.setCanvasSize(800, 600);
        // 循环展示
        while (canvasFrame.isVisible()) {
            canvasFrame.showImage(grabber.grab());
        }
        grabber.close();//关闭抓取器
    }
}

录制视频

public class Recording {

    private static final String FILE_NAME = "D://recording.mp4";

    @SuppressWarnings("resource")
    public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception {
        // 开启抓取器
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();

        //转换器,抓取一帧视频并将其转换为图像
        OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();
        IplImage iplImage = converter.convertToIplImage(grabber.grab());

        // 开启录制器
        OpenCVFrameRecorder recorder = new OpenCVFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
        recorder.setFormat("mp4");
        recorder.start();

        // 开启窗口
        CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
        canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        // 设置窗口大小
        canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
        // 循环展示
        Frame image;
        while (canvasFrame.isVisible()) {
            image = grabber.grab();
            canvasFrame.showImage(image);
            recorder.record(image);
        }

        recorder.close();// 关闭推流录制器,close包含release和stop操作
        grabber.close();// 关闭抓取器
    }
}

录制带音频的视频

public class Audio {
    // 采样率
    private final static int SAMPLE_RATE = 44100;
    // 音频通道数,2表示立体声
    private final static int CHANNEL_NUM = 2;

    private static final String FILE_NAME = "D://recording.mp4";

    @SuppressWarnings("resource")
    public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception, LineUnavailableException {

        // 音频格式的参数
        AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, 16, CHANNEL_NUM, true, false);
        // 获取数据线所需的参数
        DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
        // 从音频捕获设备取得其数据的数据线,之后的音频数据就从该数据线中获取
        TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
        line.open(audioFormat);
        // 数据线与音频数据的IO建立联系
        line.start();
        // 每次取得的原始数据大小
        final int audioBufferSize = SAMPLE_RATE * CHANNEL_NUM;
        // 初始化数组,用于暂存原始音频采样数据
        byte[] audioBytes = new byte[audioBufferSize];


        // 开启抓取器
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();

        //转换器,抓取一帧视频并将其转换为图像
        OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();
        IplImage iplImage = converter.convertToIplImage(grabber.grab());

        // 开启录制器
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
        recorder.setFormat("mp4");
        // 码率恒定
        recorder.setAudioOption("crf", "0");
        // 最高音质
        recorder.setAudioQuality(0);
        // 192 Kbps
        recorder.setAudioBitrate(192000);
        // 采样率
        recorder.setSampleRate(SAMPLE_RATE);
        // 立体声
        recorder.setAudioChannels(2);
        // 编码器
        recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
        recorder.start();

        // 开启窗口
        CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
        canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        // 设置窗口大小
        canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
        // 循环展示
        Frame image;
        while (canvasFrame.isVisible()) {
            image = grabber.grab();
            canvasFrame.showImage(image);
            recorder.record(image);

            int nBytesRead = line.read(audioBytes, 0, line.available());
            // 采样数据是16比特,也就是2字节,对应的数据类型就是short,
            // 所以准备一个short数组来接受原始的byte数组数据
            // short是2字节,所以数组长度就是byte数组长度的二分之一
            int nSamplesRead = nBytesRead / 2;
            short[] samples = new short[nSamplesRead];
            // 两个byte放入一个short中的时候,谁在前谁在后?这里用LITTLE_ENDIAN指定拜访顺序,
            ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);
            // 将short数组转为ShortBuffer对象,因为帧录制器的入参需要该类型
            ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);
            // 音频帧交给帧录制器输出
            recorder.recordSamples(SAMPLE_RATE, CHANNEL_NUM, sBuff);
        }

        recorder.close();// 关闭推流录制器,close包含release和stop操作
        grabber.close();// 关闭抓取器
    }
}

人脸识别

public class Face {


    @SuppressWarnings("resource")
    public static void main(String[] args) throws FrameGrabber.Exception {

        CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");

        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();

        // 转换器,抓取一帧视频并将其转换为图像,获取图像大小
        OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();
        Frame grab = grabber.grab();
        IplImage iplImage = imageConverter.convertToIplImage(grab);

        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        // 开启窗口
        CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
        canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        // 设置窗口大小
        canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
        // 循环展示
        Frame frame;
        while (canvasFrame.isVisible()) {
            frame = grabber.grab();
            Mat image = converter.convertToMat(frame);
            RectVector faces = new RectVector();
            cascadeClassifier.detectMultiScale(image, faces);
            for (int i = 0; i < faces.size(); i++) {
                opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));
            }
            canvasFrame.showImage(frame);
        }

        grabber.close();// 关闭抓取器
    }
}

人脸64关键点

public class FacemarkDemo {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws FrameGrabber.Exception {
        CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");
        Facemark facemark = createFacemarkLBF();
        facemark.loadModel("D:\\Workspace\\javacv-demo\\src\\main\\resources\\lbfmodel.yaml");
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();

        // 转换器,抓取一帧视频并将其转换为图像,获取图像大小
        OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();
        Frame grab = grabber.grab();
        IplImage iplImage = imageConverter.convertToIplImage(grab);

        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        // 开启窗口
        CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");
        canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // 设置窗口大小
        canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());
        // 循环展示
        Frame frame;
        while (canvasFrame.isVisible()) {
            frame = grabber.grab();
            Mat image = converter.convertToMat(frame);
            RectVector faces = new RectVector();
            cascadeClassifier.detectMultiScale(image, faces);
            Point2fVectorVector landmarks = new Point2fVectorVector();
            if (!image.empty() && faces.size() > 0) {
                facemark.fit(image, faces, landmarks);
                for (int i = 0; i < landmarks.size(); i++) {
                    drawFacemarks(image, landmarks.get(i), new Scalar().red(255));
                }

            }
            for (int i = 0; i < faces.size(); i++) {
                opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));
            }
            canvasFrame.showImage(frame);
        }

        grabber.close();// 关闭抓取器
    }
}

相关文章:

  • java集合框架的List 接口提供了两种主要的访问元素的方式:迭代器(Iterator)和索引访问,优缺点对比
  • 《C++:无可替代的编程传奇》:此文为AI自动生成
  • elementui table 自动滚动 纯js实现
  • 【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标
  • ubuntu系统下添加pycharm到快捷启动栏方法
  • 【漫话机器学习系列】134.基于半径的最近邻分类器(Radius-Based Nearest Neighbor Classifier)
  • TCP 三次握手四次挥手过程详解
  • 【C++重要!!!】赋值与初始化的区别
  • Flutter三棵树是什么,为什么这么设计
  • 【5*】坐标规则类动态规划学习笔记
  • MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。
  • 【SpringMVC】常用注解:@PathVariable
  • vue2自定义指令实现 el-input 输入数字,小数点两位 最高10位,不满足则截取符合规则的值作为新值
  • 【Pytorch实战教程】拆解PyTorch中的多头注意力:原来Transformer的核心组件可以这样玩
  • 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】
  • 【VS小知识】VS如何保存UTF8
  • Flutter Dart 面向对象编程全面解析
  • Day 2:基础知识巩固(HTML、CSS、JavaScript)
  • matlab 自适应模糊PID在反应釜温度控制中的应用
  • vue2用vscode调试打不上断点
  • 鄂州交警通报致1死2伤车祸:女子操作不当引发,已被刑拘
  • 陕西河南山西等地将现“干热风”灾害,小麦产区如何防范?
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈
  • 习近平举行仪式欢迎巴西总统卢拉访华
  • 来伊份发布关于消费者反映蜜枣粽问题处理的情况说明:与消费者达成和解
  • 6连败后再战萨巴伦卡,郑钦文期待打出更稳定发挥