在Java中通过OpenCV捕获网络摄像头。 FPS @ 30 fps而不是60

时间:2017-06-13 09:51:53

标签: java javafx webcam opencv3.0 capture

首先,对不起我的英语。它有点生锈......

我试图用opencv3.0与Java和JavaFX结合解决问题几天。

我试图从罗技c922捕获网络摄像头视频流,它可以捕获60 fps,分辨率为720p。

这里是片段......

public void startCapture(ImageView realView, int frameWidth, int frameHeight){

    moveCoordSystemToCenter(frameWidth/2, frameHeight/2);  

    if (!this.capture.isOpened()){
        capture.open(cameraNo); 

        int fourcc = VideoWriter.fourcc('M', 'J', 'P', 'G');
        capture.set(Videoio.CAP_PROP_FOURCC, fourcc);   

        capture.set(Videoio.CAP_PROP_FRAME_WIDTH,1280);
        capture.set(Videoio.CAP_PROP_FRAME_HEIGHT,720);

            TimerTask frameGrabber = new TimerTask(){
                public void run(){

                    long time = System.currentTimeMillis();
                    Image tmp =  grabFrame();

                    Platform.runLater(new Runnable(){   
                        int Counter = 1;
                        long res = 0;

                        public void run(){
                                realView.setImage(tmp);
                                res = res + System.currentTimeMillis()-time;
                                System.out.println("Fps = " + 1000 / (res/Counter)) ;
                                Counter++;
                        }
                    });
                }
            };      
                            this.timer = new Timer();       
                            timer.scheduleAtFixedRate(frameGrabber, 0, 1); // has no effect
                            System.out.println("task");
    }
    else
    {
        if (this.timer != null){
            this.timer.cancel();
            this.timer = null;
        }
    this.capture.release();
    }       
}

private Image grabFrame() {

    Image imageToShow = null;
    Mat frame = new Mat();

    if ( this.capture.isOpened()){
            try
            {

                this.capture.read(frame);
                if (!frame.empty()){
                    imageToShow = mat2Image(frame);
                }
            }
            catch (Exception e){
            }
    }
    return imageToShow; 
}

private Image mat2Image (Mat frame){
    MatOfByte buffer = new MatOfByte();
    Imgcodecs.imencode(".bmp",frame, buffer);
    return new Image(new ByteArrayInputStream(buffer.toArray()));
}

我尝试了一些像捕获(Videoio.CAP_PROP_FPS,60)这样的东西,它对30 fps以下的设置有效。

我尝试在Windows10 Cam应用程序中记录来自凸轮的一个流,它工作正常,因此在这个方向上发光或做一些问题不会有问题。

有人知道???!

格尔茨

0 个答案:

没有答案
相关问题