/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package imagegame;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.lang.reflect.Field;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
//import javafx.geometry.Rectangle2D;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;
/**
*
* @author ruhuayan
*/
public class Camera extends javax.swing.JFrame {
private ScheduledExecutorService timer;
private VideoCapture videoCapture;
private BufferedImage image;
public Camera() {
super("Camera - click screen to take a picture");
initComponents();
setLayout(new BorderLayout());
setLibraryPath();
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
videoCapture = new VideoCapture();
videoCapture.open(0);
System.out.println("Camera open: " + videoCapture.isOpened());
if(videoCapture.isOpened()){
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
// Implementation here
stop();
System.out.println("Camera released");
}
});//end WindowListener
JPanel cameraJPanel = new JPanel(){
@Override
public void paint(Graphics g) {
g.drawImage(image, 0, 0, this);
}
};
cameraJPanel.setPreferredSize(new Dimension(420,500));
add(cameraJPanel,BorderLayout.NORTH);
Runnable frameGrabber;
frameGrabber = () -> {
Mat mat = new Mat();
videoCapture.read(mat);
image = mat2BufferedImage(mat);
//g.drawImage(image, 0, 0,this);
cameraJPanel.repaint();
// rectList.stream().forEach((Rectangle2D rect) -> {
// g2d.strokeRect(rect.getMinX(), rect.getMinY(), rect.getWidth(), rect.getHeight());
// });
}; //end frameGrabber
this.timer = Executors.newSingleThreadScheduledExecutor();
this.timer.scheduleAtFixedRate(frameGrabber, 0, 133, TimeUnit.MILLISECONDS);
}else{//if videoCapture.isOpen() is false
// JOptionPane.showMessageDialog(null, "You have no camera installed");
// System.exit(1);
}
}
private static void setLibraryPath() {
try {
System.setProperty("java.library.path", "lib/");
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
public static BufferedImage mat2BufferedImage(Mat mat) {
// MatOfByte buffer = new MatOfByte();
// Imgcodecs.imencode(".png", mat, buffer);
int type = mat.channels() > 1? BufferedImage.TYPE_3BYTE_BGR : BufferedImage.TYPE_BYTE_GRAY;
BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type);
mat.get(0, 0, ((DataBufferByte)image.getRaster().getDataBuffer()).getData());
return image;
//return new Image(new ByteArrayInputStream(buffer.toArray()));
}
public BufferedImage getCameraImage(){
return image;
}
public void stop(){
timer.shutdown();
videoCapture.release();
try {
timer.awaitTermination(133, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex);
}
}
public boolean isCameraInstalled(){
return videoCapture.isOpened();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
pack();
}// //GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Camera.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Camera.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Camera.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Camera.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Camera().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}