首先,对不起我的英语。它有点生锈......
我试图用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应用程序中记录来自凸轮的一个流,它工作正常,因此在这个方向上发光或做一些问题不会有问题。
有人知道???!
格尔茨