while에서 이미지 뷰를 다시 그릴 수 없습니다. 한 번에 하나의 이미지로 작업하지 않고. 이미지 재 드로잉을 위해 다른 스레드를 사용하려고하면 작업이 될 수도 있지만, 어떻게 만들지는 모른다. ItachiUchiha이 컨트롤러는 일부 스레딩 문제가 지적했듯이 아무도 내가 그것을 채굴 할 수 방법 ^)JavaFX ImageView가 단계를 다시 그려 넣습니다.
package videostepone;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;
/**
*
* @author Анютка
*/
public class FXMLDocumentController implements Initializable {
@FXML
private Label label;
@FXML
private ImageView imageCam1;
@FXML
private void handleButtonAction(ActionEvent event) throws InterruptedException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//System.loadLibrary("opencv_java2410");
System.out.println("You clicked me!");
label.setText("Hello World!");
WebCamLive();
}
// Делает снимок с веб-камеры
private void WebCamShot() throws InterruptedException
{
VideoCapture camera = new VideoCapture(0);
Thread.sleep(1000);
camera.open(0); //Useless
if(!camera.isOpened()){
System.out.println("Camera Error");
}
else{
System.out.println("Camera OK?");
}
Mat frame = new Mat();
camera.read(frame);
System.out.println("Captured Frame Width " + frame.width());
Highgui.imwrite("camera.jpg", frame);
System.out.println("OK");
}
// Видео с веб-камеры
private void WebCamLive() throws InterruptedException
{
int i = 0;
VideoCapture camera = new VideoCapture(0);
Thread.sleep(1000);
camera.open(0); //Useless
if(!camera.isOpened()){
System.out.println("Camera Error");
}
else{
System.out.println("Camera OK?");
}
Mat frame = new Mat();
CascadeClassifier faceDetect = new CascadeClassifier("./res/haarcascade_frontalface_default.xml");
while (true)
{
camera.read(frame);
if (!frame.empty())
{
setImageOn(matToImage(frame));
// label.setText("1");
// Thread.sleep(6000);
// label.setText("-");
System.out.println(i++);
}
}
}
@FXML
private void setImageOn(Image img)
{
imageCam1.setImage(img);
}
private Image matToImage(Mat m){
MatOfByte memory = new MatOfByte();
try {
Highgui.imencode(".jpg", m, memory);
return (new Image(new ByteArrayInputStream(memory.toArray())));
} catch (Exception e) {
System.out.println(e);
}
return (new Image(new ByteArrayInputStream(memory.toArray())));
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm 귀하의'while' 루프는 자바 FX 애플리케이션 스레드가 화면에 아무것도 페인트 말도없이 무한대로 실행됩니다. 응용 프로그램 스레드에서 스레드를 무한대로 실행하면 안됩니다. – ItachiUchiha
내 스레드가 다른 클래스에 있어야합니까? 컨트롤러에 없습니까? 컨트롤러에서 할 수있는 요소로 작업하십시오. 어떻게 장면에서 이미지를 설정할 수 있습니까? –