📜  在 OpenCV 中在图像上绘制几何形状的Java程序

📅  最后修改于: 2022-05-13 01:54:39.561000             🧑  作者: Mango

在 OpenCV 中在图像上绘制几何形状的Java程序

Java中的OpenCV库包含一个名为Imgproc的类 它提供了各种方法,例如resize()wrapAffine( )filter2D来处理输入图像。我们将在这里使用javax.swing包。这 javax.swing包提供了Java swing API 的类,如JButton、JTextField、JTextArea、JRadioButton、JCheckbox、JMenuJColorChooser 等等。 这里涉及的Java概念是Swing类和抽象窗口工具包,如下所述:

Swing类这里我将解释后面程序中会用到的javax.swing包的所有类:

  • javax.swing.ImageIcon :类ImageIcon是从图像绘制图标的 Icon 接口的实现。
  • javax.swing.Jframe :类JFrame是一种容器类型,它继承了Java. JFrame 的工作方式类似于主窗口,其中添加了标签、按钮、文本字段等组件以创建 GUI
  • javax.swing.JLabel :类JLabel用于显示短字符串或图像图标。
  • javax.swing.JMenu :类JMenu用于下拉菜单组件,从菜单栏中显示。
  • javax.swing.JMenuBar : JMenuBar类用于在窗口或框架上显示菜单栏。它可能有几个菜单。
  • javax.swing.JMenuItemJMenuItem类表示菜单中的实际项目。菜单中的所有项目都应该派生自JMenuItem类或其子类之一。

Abstract Window Toolkit (AWT)是一个用于创建图形用户界面的Java包。 AWT功能包括:

  • 一组原生界面组件
  • 一个健壮的事件处理模型
  • 图形和成像工具,包括形状、颜色和字体类
  • 布局管理器,用于不依赖于特定窗口大小或屏幕分辨率的灵活窗口布局
  • 数据传输类,用于通过本机平台剪贴板进行剪切和粘贴

过程:OpenCV中在图像上绘制几何形状的步骤

  1. 创建项目并添加OpenCV
  2. 创建包
  3. 创建一个类
  4. 创建一个名为“images”的文件夹,并在其中放置一个.jpg.png文件。
  5. 在Java文件中写入以下代码。

示例输入图像:

第一步:创建项目并添加OpenCV

  • 单击文件 > 新建 > Java项目。
  • 为您的项目命名并勾选JRE项目布局选项下的必要选项,如下图所示。在这里,我将项目命名为 OpenCVShape。
  • 标记选项后单击下一步。

  • 之后转到同一对话框中的库选项。单击类路径-> 添加外部 jar。
  • 从本地机器添加opencv.jar文件或者可以下载opencv.jar文件。

  • 添加 jar 文件后,展开Classpath选项,然后单击Native library location: (None) ,然后单击Edit

  • 选择External Folder...并浏览以选择包含 OpenCV 库的文件夹(例如,Windows 下的 C:\opencv\build\ Java\x64)。单击完成。

第 2 步:创建包

  • 右键单击src 。转到新建 → 包。
  • 将出现一个对话框。将包的名称输入为com.pkg并单击Finish

第 3 步:创建一个类

  • 右键单击 com.pkg。转到新→类。
  • 将出现一个对话框。键入类的名称。我将其命名为 OpenCVShape。
  • 选中必要的选项,然后单击Finish

第 4 步:创建一个名为“images”的文件夹,并在其中放置一个.jpg.png文件。

  • 右键单击您项目名称(在本例中为 OpenCVShape)。转到新建 -> 文件夹。键入文件夹(图像)的名称,然后单击“确定”。
  • 在此文件夹中放置扩展名为.jpg.png的图像。

第五步:在Java文件中写入以下代码

I mplementation:计算上述步骤以获得不同的几何形状,如下例所示:

  1. 线
  2. 矩形
  3. 椭圆

示例 1:绘制线条

Java
// Java Program using openCV to draw lines
  
package com.pkg;
  
// Importing abstract windows toolkit classes
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
// Importing Swing classes 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
// Importing OpenCV modules
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // Menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // Loading image from local directory 
        image = Imgcodecs.imread("images/sample_image.png");
  
        // Method to view setup
        setUpView();
  
        // Loading image to jlabel
        loadImage(image);
  
        // Setting iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
  // Method to load image 
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // Change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
          
      // Add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // Add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                
                // Storing location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // Adding another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // Create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // NOW, DRAWING SHAPES
  
                    // 1. Drawing line
  
                  // Color in bgr format
                    Imgproc.line(
                        tempImage, originPoint, point,
                        new Scalar(0, 0, 0),
                        5); 
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // Adding menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
  // Main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}


Java
// Java Program using openCV to draw rectangles
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw rectangle
                    Imgproc.rectangle(
                        tempImage, originPoint, point,
                        new Scalar(255, 0, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
  // main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}


Java
// Java Program using openCV to draw circles
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw circle
                    // first find distance of origin point
                    // and point
  
                    double ab2
                        = Math.pow(originPoint.x - point.x,
                                   2)
                          + Math.pow(
                                originPoint.y - point.y, 2);
                    int distance = (int)Math.sqrt(ab2);
  
                    Imgproc.circle(
                        tempImage, originPoint, distance,
                        new Scalar(0, 255, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
    
  // Main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}


Java
// Java Program using openCV to draw ellipses
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw ecllipse
                    double x
                        = Math.abs(point.x - originPoint.x);
                    double y
                        = Math.abs(point.y - originPoint.y);
                    Size size = new Size(x * 2, y * 2);
  
                    Imgproc.ellipse(
                        tempImage,
                        new RotateRect(originPoint, size,
                                       0),
                        new Scalar(255, 255, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
  // Main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}


输出:

示例 2:绘制矩形

Java

// Java Program using openCV to draw rectangles
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw rectangle
                    Imgproc.rectangle(
                        tempImage, originPoint, point,
                        new Scalar(255, 0, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
  // main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}

输出:

示例 3:绘制圆

Java

// Java Program using openCV to draw circles
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw circle
                    // first find distance of origin point
                    // and point
  
                    double ab2
                        = Math.pow(originPoint.x - point.x,
                                   2)
                          + Math.pow(
                                originPoint.y - point.y, 2);
                    int distance = (int)Math.sqrt(ab2);
  
                    Imgproc.circle(
                        tempImage, originPoint, distance,
                        new Scalar(0, 255, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
    
  // Main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}

输出:

示例 4:绘制椭圆

Java

// Java Program using openCV to draw ellipses
  
package com.pkg;
  
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
  
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
  
public class OpenCVShapes extends JFrame {
  
    Mat image;
    Mat tempImage;
  
    JLabel imageView;
  
    // menu for save image
    private JMenuBar mb;
    private JMenu menu;
    private JMenuItem saveMenuItem;
  
    private Point originPoint;
    public OpenCVShapes()
    {
        // load image
        image = Imgcodecs.imread("images/sample_image.png");
  
        // view setup
        setUpView();
  
        // load image to jlabel
        loadImage(image);
  
        // set iframe property
        setSize(image.width(), image.height());
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    private void loadImage(Mat img)
    {
        final MatOfByte mof = new MatOfByte();
        Imgcodecs.imencode(".png", img, mof);
  
        final byte[] imageData = mof.toArray();
  
        // change image byte to image icon
        final ImageIcon icon = new ImageIcon(imageData);
        // add icon to jlabel
        imageView.setIcon(icon);
    }
  
    private void setUpView()
    {
        setLayout(null);
  
        imageView = newJLabel();
        imageView.setBounds(0, 20, image.width(),
                            image.height());
  
        // add mouse listener
        imageView.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                // store location of mouse pressed
                originPoint = new Point(e.getX(), e.getY());
            }
  
            @Override
            public void mouseReleased(MouseEvent e)
            {
                super.mouseReleased(e);
                // when mouse release replace tempimage to
                // image
                image = tempImage.clone();
            }
        });
  
        // add another event mousemotionlstener
        imageView.addMouseMotionListener(
            new MouseMotionListener() {
                @Override
                public void mouseMoved(MouseEvent e)
                {
                    // TODO Auto-generate method stub
                }
  
                @Override
                public void mouseDragged(MouseEvent e)
                {
                    // create temp image for drawing
                    tempImage = image.clone();
                    final Point point
                        = new Point(e.getX(), e.getY());
  
                    // here we will draw shapes
  
                    // draw ecllipse
                    double x
                        = Math.abs(point.x - originPoint.x);
                    double y
                        = Math.abs(point.y - originPoint.y);
                    Size size = new Size(x * 2, y * 2);
  
                    Imgproc.ellipse(
                        tempImage,
                        new RotateRect(originPoint, size,
                                       0),
                        new Scalar(255, 255, 0), 5);
  
                    loadImage(tempImage);
                }
            });
  
        add(imageView);
  
        // add menu
        mb = new JMenuBar();
        menu = new JMenu("file");
        saveMenuItem = new JMenuItem("save");
        menu.add(saveMenuItem);
        mb.add(menu);
  
        mb.setBounds(0, 0, image.width(), 20);
        add(mb);
  
        saveMenuItem.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Imgcodecs.imwrite("images/ind1.png",
                                      image);
                }
            });
    }
  
    private JLabel newJLabel()
    {
        // TODO Auto-generated method stub
        return null;
    }
  
  // Main driver method
    public static void main(String[] args)
    {
        // Loading library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            @Override public void run()
            {
                new OpenCVShapes();
            }
        });
    }
}

输出: