zoukankan      html  css  js  c++  java
  • JavaCV 采集摄像头及桌面视频数据

    javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好。

    之前使用JavaCV库都是使用ffmpeg native API开发,这种方式使用起来太多坑了,还是使用JavaCV封装好的库开发方便。

    其他关于JavaCV的文章,可以通过下面的链接查看:
    JavaCV-开发系列文章汇总篇(https://www.cnblogs.com/itqn/p/14696221.html)

    引入依赖

    前几天刚刚发布了1.5.5,这里使用最新的javacv依赖:

    <properties>
      <javacpp.version>1.5.5</javacpp.version>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv</artifactId>
        <version>${javacpp.version}</version>
      </dependency>
      <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv-platform</artifactId>
        <version>${javacpp.version}</version>
      </dependency>
    </dependencies>
    

    OpenCVFrameGrabber采集摄像头数据

    javacv的demo中有摄像头及麦克风采集音视频数据的例子(WebcamAndMicrophoneCapture),例子采集摄像头数据使用的就是OpenCVFrameGrabber,视频画面回显采用的是CanvasFrame

    public class Sample01_Camera {
    
      @SuppressWarnings("resource")
      public static void main(String[] args) throws Exception {
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.setImageWidth(1280);
        grabber.setImageHeight(720);
        grabber.start();
        CanvasFrame canvas = new CanvasFrame("摄像头");
        canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas.setAlwaysOnTop(true);
    
        while (canvas.isDisplayable()) {
          canvas.showImage(grabber.grab());
          TimeUnit.MILLISECONDS.sleep(40);
        }
        
        grabber.stop();
      }
    }
    

    画面预览效果图:

    FFmpegFrameGrabber采集摄像头数据

    FFmpegFrameGrabber采集摄像头数据需要指定输入,如:video=Integrated Camera,这里Integrated Camera是摄像头的设备名。

    可以通过以下方式获取摄像头设备名:

    1. 打开“计算机管理”->“设备管理器”->“照相机”
    2. 使用ffmpeg命令,具体查看之前我的文章 JavaCV FFmpeg采集摄像头YUV视频数据

    采用FFmpeg查看本机设备的命令:

    ffmpeg.exe -list_devices true -f dshow -i dummy  
    

    FFmpegFrameGrabber的使用方式跟OpenCVFrameGrabber的方式是一样的,只不过OpenCVFrameGrabber指定的是设备索引,而FFmpegFrameGrabber指定设备输入。

    public class Sample02_Camera {
      @SuppressWarnings("resource")
      public static void main(String[] args) throws Exception {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video=Integrated Camera");
        grabber.setImageWidth(1280);
        grabber.setImageHeight(720);
        grabber.setFormat("dshow");
        grabber.start();
        CanvasFrame canvas = new CanvasFrame("摄像头");
        canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas.setAlwaysOnTop(true);
    
        while (canvas.isDisplayable()) {
          canvas.showImage(grabber.grab());
          TimeUnit.MILLISECONDS.sleep(40);
        }
    
        grabber.stop();
      }
    }
    

    FFmpegFrameGrabber采集桌面数据

    FFmpegFrameGrabber采集桌面采用gdigrab,参考雷神的博客 FFmpeg源代码简单分析:libavdevice的gdigrab

    public class Sample03_Desktop {
    
      // https://blog.csdn.net/leixiaohua1020/article/details/44597955
      @SuppressWarnings("resource")
      public static void main(String[] args) throws Exception {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
        grabber.setFormat("gdigrab");
        grabber.setOption("offset_x", "0");
        grabber.setOption("offset_y", "0");
        grabber.setOption("framerate", "25");
        grabber.setOption("draw_mouse", "0");
        grabber.setOption("video_size", "1920x1080");
        // 这种形式,双屏有问题
        // grabber.setImageWidth(1920);
        // grabber.setImageWidth(1080);
        grabber.start();
        CanvasFrame canvas = new CanvasFrame("摄像头");
        canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas.setAlwaysOnTop(true);
    
        while (canvas.isDisplayable()) {
          canvas.showImage(grabber.grab());
          TimeUnit.MILLISECONDS.sleep(40);
        }
    
        grabber.stop();
      }
    }
    

    画面预览效果图:

    这里由于我的电脑是2K屏,这里1920x1080只是截图了屏幕的一部分。

    =========================================================
    HiIT青年
    关注公众号,阅读更多关于JavaCV的文章。

  • 相关阅读:
    java如何实现以数据流的形式下载压缩包到本地?
    在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?
    windows中当你的键盘无法使用时我们可以用另一种方法哦
    Idea中如何将web项目打包成war包并放到tomcat中启动
    [CSS3] Use media query to split css files and Dark mode (prefers-color-scheme: dark)
    [PWA] Storage information for PWA application
    [HTML5] Native lazy-loading for the web
    [Dynamic Programming] 198. House Robber
    [Javascript] Sort by multi factors
    [Javascript] Keyword 'in' to check prop exists on Object
  • 原文地址:https://www.cnblogs.com/itqn/p/14531823.html
Copyright © 2011-2022 走看看