如何在openCV java中从视频中提取特定帧

56lgkhnf  于 2022-11-15  发布在  Java
关注(0)|答案(1)|浏览(220)

我想使用openCV java从视频中提取一个特定的帧。为此,我使用了以下代码,

int tmsec;

VideoCapture cap = new VideoCapture();

                    String input = "/storage/emulated/0/DCIM/Camera/VID_20221005_013149.mp4";

                    cap.open(input);

                    Mat frame = new Mat();
                    cap.set(Videoio.CAP_PROP_POS_MSEC, tmsec);
                    cap.read(frame);
                    if (Imgcodecs.imwrite("/storage/emulated/0/Images/testImg.jpg", frame)) {
                        System.out.println("Success");
                    } else {
                        System.out.println("Failed");
                    }

帧的时间(以毫秒为单位)已正确分配给变量“tmsec”(没有错误。此处未显示该代码)。
在使用不同的'tmsec'值运行此代码几次后,每次我都得到第一帧,而不是指定的帧。
我的代码中有什么错误?“cap.set(Videoio.CAP_PROP_POS_MSEC,tmsec)”是否有任何错误?不支持吗?有人能告诉我我的代码或任何替代方法有什么错误吗?

9rnv2umw

9rnv2umw1#

您可能需要使用支持CAP_PROP_POS_MSEC的某个后端来构建OpenCV
从官方文件来看:
阅读/写入属性涉及许多层。**沿着此链可能会发生一些意外结果。**有效行为取决于设备硬件、驱动程序和API后端。
您可以使用cap.getBackendName()方法检查后端-文档
下面是关于后端的一般信息:
https://docs.opencv.org/4.6.0/d0/da7/videoio_overview.html
还要注意CAP_PROP_POS_MSEC可能无法正常工作,例如在视频帧速率可变的情况下,即使使用FFmpeg等工作的后端。

相关问题