Java 使用OpenCV录制时,网络摄像头的FPS较低?

Java 使用OpenCV录制时,网络摄像头的FPS较低?,java,opencv,webcam,frame-rate,latency,Java,Opencv,Webcam,Frame Rate,Latency,我一直在使用OpenCV构建一个Java应用程序,该应用程序从网络摄像头中获取数据并进行记录。然而,我一直无法实现大于10fps的帧速率(英特尔i5-5200u,8gbram),这对我来说似乎不太合适。我的网络摄像头支持每秒30帧和1280 x 720分辨率。以640 x 480的速度录制仅增加到约12 FPS。以720p的速度录制(我需要为我的应用程序执行此操作)将达到上述10。我的第一个想法是VideoCapture.read()函数需要相对较长的处理时间,因此我尝试将这些调用移动到线程池,

我一直在使用OpenCV构建一个Java应用程序,该应用程序从网络摄像头中获取数据并进行记录。然而,我一直无法实现大于10fps的帧速率(英特尔i5-5200u,8gbram),这对我来说似乎不太合适。我的网络摄像头支持每秒30帧和1280 x 720分辨率。以640 x 480的速度录制仅增加到约12 FPS。以720p的速度录制(我需要为我的应用程序执行此操作)将达到上述10。我的第一个想法是VideoCapture.read()函数需要相对较长的处理时间,因此我尝试将这些调用移动到线程池,但没有获得任何好处。我读过所有关于这个图书馆应该有多快的文章,所以我一定是做错了什么。以下是捕获数据的循环:

    VideoCapture cam = new VideoCapture();
    cam.open(0);

    // set proper resolution
    cam.set(Videoio.CV_CAP_PROP_FRAME_WIDTH, CAMERA_WIDTH);
    cam.set(Videoio.CV_CAP_PROP_FRAME_HEIGHT, CAMERA_HEIGHT);

    // Matrix for storing camera images, provided by OpenCV
    ArrayList<Mat> framesList = new ArrayList<>();

    long startTime = System.currentTimeMillis();

    if( ! cam.isOpened()) {
        System.err.println("Camera could not be opened.");
    }

    else {
        System.out.println("Capturing...");

        while(System.currentTimeMillis() - startTime < 1000 * SECONDS_TO_RUN) {

            Mat frame = new Mat();
            cam.read(frame);
            framesList.add(frame);

        }

        cam.release();

        System.out.println("Done recording. " + framesList.size() + " frames captured.");
        System.out.println("Framerate : " + framesList.size() / SECONDS_TO_RUN);
VideoCapture cam=新的VideoCapture();
凸轮打开(0);
//设定适当的分辨率
凸轮组(Videoio.CV\u CAP\u PROP\u FRAME\u WIDTH,CAMERA\u WIDTH);
凸轮组(Videoio.CV\u CAP\u PROP\u FRAME\u HEIGHT,CAMERA\u HEIGHT);
//用于存储摄像机图像的矩阵,由OpenCV提供
ArrayList framesList=新建ArrayList();
long startTime=System.currentTimeMillis();
如果(!cam.isOpened()){
System.err.println(“摄像头无法打开”);
}
否则{
System.out.println(“捕获…”);
while(System.currentTimeMillis()-startTime<1000*秒运行){
垫架=新垫();
凸轮读取(帧);
framesList.add(frame);
}
凸轮释放();
System.out.println(“完成录制。”+framesList.size()+“捕获帧”);
System.out.println(“帧速率:“+framesList.size()/SECONDS\u TO\u RUN”);

执行此循环需要多少秒?能否删除缓冲区:framesList.add(frame)?@Mika,谢谢你的回答。我已经试着跑了5秒、10秒、30秒。所有长度都是8-10帧。对不起,我有点困惑,你说删除缓冲是什么意思?据我所知,除了视频捕获之外,没有其他方法可以抓取相机数据。阅读(帧)方法?删除list.add调用,以真正执行capturing@Micka再次感谢。删除缓冲区并没有提供任何性能提升。您的相机是否可以在不同程序(如VLC)中以所需的帧速率和分辨率工作?可能全帧速率只能在降低分辨率的情况下工作?执行此循环需要多少秒?可以吗删除缓冲:framesList.add(frame);?@mika,谢谢你的回复。我已经试着跑了5、10、30秒。所有长度都是8-10fps。对不起,我有点困惑,你说删除缓冲是什么意思?据我所知,除了视频捕获之外,没有其他方法可以抓取相机数据。阅读(frame)方法?删除list.add调用,以真正执行capturing@Micka再次感谢。删除缓冲区并没有提供任何性能提升。您的相机是否可以在不同程序(如VLC)中以所需的帧速率和分辨率工作?可能全帧速率只能在降低分辨率的情况下工作?