Я пытался сделать простое приложение, которое открывает и закрывает камеру.Пока что открывающая часть работает, но каждый раз, когда я пытаюсь закрыть камеру, происходит такая серия событий:
- Съемка прекращается, но огни продолжают гореть, а изображение не очищается..
- Во второй раз, когда я нажимаю кнопку «Стоп», изображение очищается.
- После этого, всякий раз, когда я нажимаю кнопку «Старт», независимо от того, сделал ли я шаг 2, он ничего не делает.и выдает мне эту ошибку:
[WARN: 1] videoio (MSMF): OnReadSample () вызывается с состоянием ошибки: -1072875772 [WARN: 1] videoio (MSMF): asyncСбой вызова ReadSample () с состоянием ошибки: -1072875772 [WARN: 2] videoio (MSMF): невозможно захватить кадр.Ошибка: -1072875772
package application;
import java.io.ByteArrayInputStream;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
public class FXHelloCVController {
@FXML
private AnchorPane MainPane;
@FXML
private Button StartButton;
@FXML
private ImageView currentFrame;
@FXML
private Button StopButton;
private ScheduledExecutorService timer;
private VideoCapture capture = new VideoCapture();
private boolean cameraActive = false;
private static int cameraID = 0;
@FXML
void startCamera(ActionEvent event) {
if(!this.cameraActive) {
//if the camera is not active, open the camera
cameraActive = true;
this.capture.open(cameraID);
if(this.capture.isOpened()) {
//if the stream is available, run at 30fps (33 ms)
Runnable frameGrabber = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Image imageToShow = grabFrame();
Platform.runLater(new Runnable() {
@Override public void run() {
currentFrame.setImage(imageToShow); }
});
}
};
this.timer = Executors.newSingleThreadScheduledExecutor();
this.timer.scheduleAtFixedRate(frameGrabber, 0, 33,
TimeUnit.MILLISECONDS);
}
}
}
private Image grabFrame() {
// TODO Auto-generated method stub
Mat frame = new Mat();
MatOfByte buffer = new MatOfByte();
// check if the capture is open
if (this.capture.isOpened()){
try{
// read the current frame
this.capture.read(frame);
// if the frame is not empty, process it
if (!frame.empty()){
Imgcodecs.imencode(".png", frame, buffer);
}
}catch(Exception e){
// log the error
System.err.println("Exception during the image elaboration: " +
e);
}
}
return new Image(new ByteArrayInputStream(buffer.toArray()));
}
@FXML
private void stopCamera(){
cameraActive = false;
if (this.timer!=null && !this.timer.isShutdown()){
try{
// stop the timer
this.timer.awaitTermination(33, TimeUnit.MILLISECONDS);
this.timer.shutdown();
this.currentFrame.setImage(null);
}catch (InterruptedException e){
e.printStackTrace();
}
}
Это прямо здесь, мой объект контроллера, может кто-нибудь помочь мне выяснить, что не так?