/
Alx89
/
OpenCV
Обзор
Документация
Войти
/
Alx89
/
OpenCV
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
4.x
samples/java/tutorial_code/ImgProc/erosion_dilatation/MorphologyDemo1.java
159 строк
5 KB
Maksim Shabunin
Backport C-API cleanup (imgproc) from 5.x
16 янв 2023, 23:29
16 янв 2023, 23:29
c1e5c16
Код
Авторство
О чём код?
import java.awt.BorderLayout; import java.awt.Container; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; 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.Point; import org.opencv.core.Size; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class MorphologyDemo1 { private static final String[] ELEMENT_TYPE = { "Rectangle", "Cross", "Ellipse" }; private static final String[] MORPH_OP = { "Erosion", "Dilatation" }; private static final int MAX_KERNEL_SIZE = 21; private Mat matImgSrc; private Mat matImgDst = new Mat(); private int elementType = Imgproc.MORPH_RECT; private int kernelSize = 0; private boolean doErosion = true; private JFrame frame; private JLabel imgLabel; //! [constructor] public MorphologyDemo1(String[] args) { String imagePath = args.length > 0 ? args[0] : "../data/LinuxLogo.jpg"; matImgSrc = Imgcodecs.imread(imagePath); if (matImgSrc.empty()) { System.out.println("Empty image: " + imagePath); System.exit(0); } // Create and set up the window. frame = new JFrame("Erosion and dilatation demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set up the content pane. Image img = HighGui.toBufferedImage(matImgSrc); addComponentsToPane(frame.getContentPane(), img); // Use the content pane's default BorderLayout. No need for // setLayout(new BorderLayout()); // Display the window. frame.pack(); frame.setVisible(true); } //! [constructor] //! [components] private void addComponentsToPane(Container pane, Image img) { if (!(pane.getLayout() instanceof BorderLayout)) { pane.add(new JLabel("Container doesn't use BorderLayout!")); return; } JPanel sliderPanel = new JPanel(); sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS)); JComboBox<String> elementTypeBox = new JComboBox<>(ELEMENT_TYPE); elementTypeBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @SuppressWarnings("unchecked") JComboBox<String> cb = (JComboBox<String>)e.getSource(); if (cb.getSelectedIndex() == 0) { elementType = Imgproc.MORPH_RECT; } else if (cb.getSelectedIndex() == 1) { elementType = Imgproc.MORPH_CROSS; } else if (cb.getSelectedIndex() == 2) { elementType = Imgproc.MORPH_ELLIPSE; } update(); } }); sliderPanel.add(elementTypeBox); sliderPanel.add(new JLabel("Kernel size: 2n + 1")); JSlider slider = new JSlider(0, MAX_KERNEL_SIZE, 0); slider.setMajorTickSpacing(5); slider.setMinorTickSpacing(5); slider.setPaintTicks(true); slider.setPaintLabels(true); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { JSlider source = (JSlider) e.getSource(); kernelSize = source.getValue(); update(); } }); sliderPanel.add(slider); JComboBox<String> morphOpBox = new JComboBox<>(MORPH_OP); morphOpBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @SuppressWarnings("unchecked") JComboBox<String> cb = (JComboBox<String>)e.getSource(); doErosion = cb.getSelectedIndex() == 0; update(); } }); sliderPanel.add(morphOpBox); pane.add(sliderPanel, BorderLayout.PAGE_START); imgLabel = new JLabel(new ImageIcon(img)); pane.add(imgLabel, BorderLayout.CENTER); } //! [components] //! [update] private void update() { //! [kernel] Mat element = Imgproc.getStructuringElement(elementType, new Size(2 * kernelSize + 1, 2 * kernelSize + 1), new Point(kernelSize, kernelSize)); //! [kernel] if (doErosion) { //! [erosion] Imgproc.erode(matImgSrc, matImgDst, element); //! [erosion] } else { //! [dilation] Imgproc.dilate(matImgSrc, matImgDst, element); //! [dilation] } Image img = HighGui.toBufferedImage(matImgDst); imgLabel.setIcon(new ImageIcon(img)); frame.repaint(); } //! [update] //! [main] public static void main(String[] args) { // Load the native OpenCV library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // Schedule a job for the event dispatch thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MorphologyDemo1(args); } }); } //! [main] }