java集成opencv,将视频按帧进行拆分

这篇博客介绍了如何在Windows10上利用OpenCV4.52版本将视频文件拆分成单帧图片,并保存每个图片的名称为对应帧的时间戳。博主遇到的问题包括VideoCapture的isOpened()返回false,以及ffmpeg解析帧时出现错误。解决方法是将特定dll文件复制到Java的bin目录,并注释掉可能导致问题的代码行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:将视频按照每一帧进行拆分,并且保存为图片。每张图片的名字为当前帧的时间。

 

1、window10 系统 安装opencv 4.52版本

      下载地址:Find out more about OpenCV | SourceForge.net

2、自定义安装目录,直接安装

3、 将Opencv库添加到项目中

        在IDEA 中的 Project Structure => Modules => Dependencies 中添加 opencv 安装目录下的的jar包 D:\opencv\build\java\opencv-452.jar

同时将D:\opencv\build\java\x64\opencv_java452.dll,添加为Native Libary

上述操作是为了下面代码做铺垫,把opencv库添加进来。

//加载本地的OpenCV库,这样就可以用它来调用Java API
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

代码:

   // 创建VideoCapture对象 
VideoCapture cap = new VideoCapture(videoPath);
                    //判断视频是否打开
       if (cap.isOpened()) {
                        //总帧数
         int frameCount = new Double(cap.get((Videoio.CAP_PROP_FRAME_COUNT))).intValue();

         logger.info("{}视频一共{}帧", file_name, frameCount);
                        // 创建mat
         Mat frame = new Mat();
         for (int i = 0; i < frameCount; i++) {
               // 读取下一帧的数据
              if (cap.read(frame)) {
                  // 获取当前帧的时间戳
            int video_mesc = new Double(cap.get(Videoio.CAP_PROP_POS_MSEC)).intValue();
//          cap.set(Videoio.CAP_PROP_POS_MSEC,2 * 1000);
            //  file_date通过视频名字获取时间,然后根据帧的视频戳进行相加计算
            String curTime = simpleDateFormat.format(new Date(file_date.getTime() + video_mesc));
            String outFileName = out_directory + File.separator + file_name + "@" + curTime + ".jpg";
            // 写出图片
            Imgcodecs.imwrite(outFileName, frame);
    }
}

问题记录:

1、VideoCapture的isOpened()方法一直返回false。

解决办法:

         将opencv安装目录D:\opencv\build\x64\vc14\bin中的opencv_videoio_ffmpeg452_64.dll复制到生成 java的安装目录 C:\Program Files\Java\jdk1.8.0_191\bin 中去。

2、读取帧 提示:[NULL @ 0000022362197940] non-existing PPS 0 referenced

     当根据时间获取相应的帧数据时,会出现ffmpeg解析问题,不知道如何解决。暂时没用,给注掉了。

 cap.set(Videoio.CAP_PROP_POS_MSEC,2 * 1000);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值