zoukankan      html  css  js  c++  java
  • javacv——读取摄像头的图像、截取视频的画面

    javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视频,图片等文件后期操作(图片修改,音视频解码剪辑等等功能)。

      这些需要引入的包。音视频处理使用ffmpeg,图像处理使用opencv,摄像头抓取使用opencv

    1、读取摄像头的图像

    public class JavavcCameraTest{
        public static void main(String[] args) throws Exception, InterruptedException{
            OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
            grabber.start();   //开始获取摄像头数据
            CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
            canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            canvas.setAlwaysOnTop(true);
            while(true){
                if(!canvas.isDisplayable()){//窗口是否关闭
                    grabber.stop();//停止抓取
                    System.exit(2);//退出
                    break;
                }    
                canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
                Thread.sleep(200);//50毫秒刷新一次图像
            }
        }
    }

    效果:

    2、截取摄像头都画面并保存下来

    public class JavavcCameraTest
    {
        static OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
    
        public static void main(String[] args) throws Exception, InterruptedException
        {
            OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
            grabber.start();   //开始获取摄像头数据
            CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
            canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            canvas.setAlwaysOnTop(true);
            int ex = 0;
            while(true)
            {
                if(!canvas.isDisplayable())
                {//窗口是否关闭
                    grabber.stop();//停止抓取
                    System.exit(2);//退出
                    break;
                }       
                canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
                opencv_core.Mat mat = converter.convertToMat(grabber.grabFrame());
                ex++;
                opencv_imgcodecs.imwrite("d:\img\" + ex + ".png", mat);
                Thread.sleep(200);//50毫秒刷新一次图像
            }
        }
    }

    grabber.grab()和grabber.grabFrame()都可以获得当时摄像头的图像,但都是Frame类型的图像,想要保存需要先调用penCVFrameConverter.ToIplImage的convertToMat转换为mat类型,然后调用opencv_imgcodecs.imwrite()方法进行保存。

    效果:

     3、截取视频的画面

    public abstract class FrameGrabberKit {
    
        public static void main(String[] args) throws Exception {
            String inputFilePth = "C:\Users\Administrator\Desktop\a.mp4";
            randomGrabberFFmpegImage(inputFilePth, 5);
        }
    
        public static void randomGrabberFFmpegImage(String filePath, int randomSize)
                throws Exception {
            FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
            ff.start();
    
            int ffLength = ff.getLengthInFrames();
            List<Integer> randomGrab = random(ffLength, randomSize);
            int maxRandomGrab = randomGrab.get(randomGrab.size() - 1);
            Frame f;
            int i = 0;
            while (i < ffLength) {
                f = ff.grabImage();
                if (randomGrab.contains(i)) {
                    doExecuteFrame(f, i);
                }
                if (i >= maxRandomGrab) {
                    break;
                }
                i++;
            }
            ff.stop();
        }
    
        public static void doExecuteFrame(Frame f, int index) {
            if (null == f || null == f.image) {
                return;
            }
            OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
            String imageMat = "png";
            String FileName = "D:\img";
            opencv_core.Mat mat = converter.convertToMat(f);
            opencv_imgcodecs.imwrite("d:\img\" + index + "sls.png", mat);//存储图像
        }
    
        public static List<Integer> random(int baseNum, int length) {
            List<Integer> list = new ArrayList<>(length);
            while (list.size() < length) {
                Integer next = (int) (Math.random() * baseNum);
                if (list.contains(next)) {
                    continue;
                }
                list.add(next);
            }
            Collections.sort(list);
            return list;
        }
    }

    inputFilePth是视频的路径。这里随机挑了5个画面的图像存储下来。

    效果:

  • 相关阅读:
    Android Market google play store帐号注册方法流程 及发布应用注意事项【转载】
    cocos2d-x 调用第三方so文件
    ios cocos2d-x 多点触摸
    linux文件分割(将大的日志文件分割成小的)
    Linux 统计某个字符串出现的次数
    scapy基础-网络数据包结构
    mac 下idea光标问题
    mac ox终端显示 bogon的问题
    hibernate和mybatis的区别
    memcached知识点梳理
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/7832079.html
Copyright © 2011-2022 走看看