package swing;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import utils.Images;
public class Test {
static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
private JFrame frame;
private double[] minHSV = new double[3];
private double[] maxHSV = new double[3];
private Size size = new Size();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Test() {
size = new Size(800, 700);
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
//TODO change image path
Mat src = Imgcodecs.imread("d:/c/table.png");
if (src.empty()) {
System.err.println("Image path is empty!!!");
return;
}
size = src.size();
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2HSV);
frame = new JFrame();
frame.setBounds(100, 100, 851, 652);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JSlider slider_minH = new JSlider();
slider_minH.setMaximum(255);
slider_minH.setBounds(44, 10, 190, 26);
frame.getContentPane().add(slider_minH);
JLabel lbl_minH = new JLabel("minH");
lbl_minH.setFont(new Font("宋体", Font.PLAIN, 14));
lbl_minH.setBounds(10, 10, 29, 26);
frame.getContentPane().add(lbl_minH);
JLabel lbl_showMinH = new JLabel("");
lbl_showMinH.setBounds(257, 10, 54, 26);
frame.getContentPane().add(lbl_showMinH);
JLabel lbl_minS = new JLabel("minS");
lbl_minS.setFont(new Font("宋体", Font.PLAIN, 14));
lbl_minS.setBounds(10, 46, 29, 25);
frame.getContentPane().add(lbl_minS);
JLabel lbl_showMinS = new JLabel("");
lbl_showMinS.setBounds(257, 51, 54, 15);
frame.getContentPane().add(lbl_showMinS);
JSlider slider_minS = new JSlider();
slider_minS.setMaximum(255);
slider_minS.setBounds(44, 46, 190, 26);
frame.getContentPane().add(slider_minS);
JLabel lbl_minV = new JLabel("minV");
lbl_minV.setFont(new Font("宋体", Font.PLAIN, 14));
lbl_minV.setBounds(10, 81, 29, 27);
frame.getContentPane().add(lbl_minV);
JLabel lbl_showMinV = new JLabel("");
lbl_showMinV.setBounds(257, 87, 54, 15);
frame.getContentPane().add(lbl_showMinV);
JSlider slider_minV = new JSlider();
slider_minV.setMaximum(255);
slider_minV.setBounds(44, 82, 190, 26);
frame.getContentPane().add(slider_minV);
JLabel lbl_img = new JLabel("");
lbl_img.setBounds(0, 122, (int)size.width, 483);
frame.getContentPane().add(lbl_img);
JLabel lbl_maxH = new JLabel("maxH");
lbl_maxH.setFont(new Font("宋体", Font.PLAIN, 14));
lbl_maxH.setBounds(364, 16, 54, 15);
frame.getContentPane().add(lbl_maxH);
JLabel lbl_showMaxH = new JLabel("");
lbl_showMaxH.setBounds(656, 16, 54, 15);
frame.getContentPane().add(lbl_showMaxH);
JSlider slider_maxH = new JSlider();
slider_maxH.setMaximum(255);
slider_maxH.setBounds(446, 10, 200, 26);
frame.getContentPane().add(slider_maxH);
JLabel lblMaxs = new JLabel("maxS");
lblMaxs.setFont(new Font("宋体", Font.PLAIN, 14));
lblMaxs.setBounds(364, 51, 54, 15);
frame.getContentPane().add(lblMaxs);
JLabel lbl_showMaxS = new JLabel("");
lbl_showMaxS.setBounds(656, 51, 54, 15);
frame.getContentPane().add(lbl_showMaxS);
JSlider slider_maxS = new JSlider();
slider_maxS.setMaximum(255);
slider_maxS.setBounds(446, 46, 200, 26);
frame.getContentPane().add(slider_maxS);
JLabel lblMaxv = new JLabel("maxV");
lblMaxv.setFont(new Font("宋体", Font.PLAIN, 14));
lblMaxv.setBounds(364, 87, 54, 15);
frame.getContentPane().add(lblMaxv);
JLabel lbl_showMaxV = new JLabel("");
lbl_showMaxV.setBounds(656, 87, 54, 15);
frame.getContentPane().add(lbl_showMaxV);
JSlider slider_maxV = new JSlider();
slider_maxV.setMaximum(255);
slider_maxV.setBounds(446, 81, 200, 26);
frame.getContentPane().add(slider_maxV);
slider_minH.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
minHSV[0]= slider_minH.getValue();
lbl_showMinH.setText(slider_minH.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
slider_minS.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
minHSV[1] = slider_minS.getValue();
lbl_showMinS.setText(slider_minS.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
slider_minV.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
minHSV[2] = slider_minV.getValue();
lbl_showMinV.setText(slider_minV.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
slider_maxH.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
maxHSV[0] = slider_maxH.getValue();
lbl_showMaxH.setText(slider_maxH.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
slider_maxS.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
maxHSV[1] = slider_maxS.getValue();
lbl_showMaxS.setText(slider_maxS.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
slider_maxV.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
maxHSV[2] = slider_maxV.getValue();
lbl_showMaxV.setText(slider_maxV.getValue()+"");
Image image = Images.toBufferedImage(processedHSV(src, minHSV, maxHSV));
lbl_img.setIcon(new ImageIcon(image));
}
});
}
private Mat processedHSV(Mat input, double[] minHSV, double[] maxHSV) {
Mat dst = new Mat();
Core.inRange(input, new Scalar(minHSV), new Scalar(maxHSV), dst);
return dst;
}
}
// class Images 的方法
//转换成为BufferedImage
public static BufferedImage toBufferedImage(Mat source) {
//顶一个字节数组矩阵
MatOfByte mob = new MatOfByte();
//压缩数据到字节矩阵
Imgcodecs.imencode(".png", source, mob);
//将矩阵转数组
byte[] byteArray =mob.toArray();
//从数组构建一个输入流
InputStream input=new ByteArrayInputStream(byteArray);
//从输入流中读取图像
try {return ImageIO.read(input);} catch (IOException e) {return null;}
}
样式:
需要OpenCV 环境