OpenCV 工具 ---- 手动调试 HSV的合适的值

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 环境

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值