在 OpenCV 中在图像上绘制几何形状的Java程序
Java中的OpenCV库包含一个名为Imgproc的类 它提供了各种方法,例如resize() 、 wrapAffine( ) 、 filter2D来处理输入图像。我们将在这里使用javax.swing包。这 javax.swing包提供了Java swing API 的类,如JButton、JTextField、JTextArea、JRadioButton、JCheckbox、JMenu 、 JColorChooser 、 等等。 这里涉及的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.JMenuItem : JMenuItem类表示菜单中的实际项目。菜单中的所有项目都应该派生自JMenuItem类或其子类之一。
We also need to use the Abstract Window Toolkit (AWT) in the program. It is part of the Java Foundation Classes (JFC). I will briefly describe AWT here.
Abstract Window Toolkit (AWT)是一个用于创建图形用户界面的Java包。 AWT功能包括:
- 一组原生界面组件
- 一个健壮的事件处理模型
- 图形和成像工具,包括形状、颜色和字体类
- 布局管理器,用于不依赖于特定窗口大小或屏幕分辨率的灵活窗口布局
- 数据传输类,用于通过本机平台剪贴板进行剪切和粘贴
过程:在OpenCV中在图像上绘制几何形状的步骤
- 创建项目并添加OpenCV库
- 创建包
- 创建一个类
- 创建一个名为“images”的文件夹,并在其中放置一个.jpg或.png文件。
- 在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:绘制线条
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();
}
});
}
}
输出: