mirror of
https://github.com/opencv/opencv.git
synced 2024-12-23 07:58:00 +08:00
187 lines
5.5 KiB
Java
187 lines
5.5 KiB
Java
|
import org.opencv.core.*;
|
||
|
import org.opencv.core.Point;
|
||
|
import org.opencv.highgui.HighGui;
|
||
|
import org.opencv.imgproc.Imgproc;
|
||
|
|
||
|
import java.util.*;
|
||
|
import java.util.List;
|
||
|
|
||
|
class GeometricDrawingRun{
|
||
|
|
||
|
private static final int W = 400;
|
||
|
|
||
|
public void run(){
|
||
|
//! [create_images]
|
||
|
/// Windows names
|
||
|
String atom_window = "Drawing 1: Atom";
|
||
|
String rook_window = "Drawing 2: Rook";
|
||
|
|
||
|
/// Create black empty images
|
||
|
Mat atom_image = Mat.zeros( W, W, CvType.CV_8UC3 );
|
||
|
Mat rook_image = Mat.zeros( W, W, CvType.CV_8UC3 );
|
||
|
//! [create_images]
|
||
|
|
||
|
//! [draw_atom]
|
||
|
/// 1. Draw a simple atom:
|
||
|
/// -----------------------
|
||
|
MyEllipse( atom_image, 90.0 );
|
||
|
MyEllipse( atom_image, 0.0 );
|
||
|
MyEllipse( atom_image, 45.0 );
|
||
|
MyEllipse( atom_image, -45.0 );
|
||
|
|
||
|
/// 1.b. Creating circles
|
||
|
MyFilledCircle( atom_image, new Point( W/2, W/2) );
|
||
|
//! [draw_atom]
|
||
|
|
||
|
//! [draw_rook]
|
||
|
/// 2. Draw a rook
|
||
|
/// ------------------
|
||
|
/// 2.a. Create a convex polygon
|
||
|
MyPolygon( rook_image );
|
||
|
|
||
|
//! [rectangle]
|
||
|
/// 2.b. Creating rectangles
|
||
|
Imgproc.rectangle( rook_image,
|
||
|
new Point( 0, 7*W/8 ),
|
||
|
new Point( W, W),
|
||
|
new Scalar( 0, 255, 255 ),
|
||
|
-1,
|
||
|
8,
|
||
|
0 );
|
||
|
//! [rectangle]
|
||
|
|
||
|
/// 2.c. Create a few lines
|
||
|
MyLine( rook_image, new Point( 0, 15*W/16 ), new Point( W, 15*W/16 ) );
|
||
|
MyLine( rook_image, new Point( W/4, 7*W/8 ), new Point( W/4, W ) );
|
||
|
MyLine( rook_image, new Point( W/2, 7*W/8 ), new Point( W/2, W ) );
|
||
|
MyLine( rook_image, new Point( 3*W/4, 7*W/8 ), new Point( 3*W/4, W ) );
|
||
|
//! [draw_rook]
|
||
|
|
||
|
/// 3. Display your stuff!
|
||
|
HighGui.imshow( atom_window, atom_image );
|
||
|
HighGui.moveWindow( atom_window, 0, 200 );
|
||
|
HighGui.imshow( rook_window, rook_image );
|
||
|
HighGui.moveWindow( rook_window, W, 200 );
|
||
|
|
||
|
HighGui.waitKey( 0 );
|
||
|
System.exit(0);
|
||
|
}
|
||
|
|
||
|
/// Function Declaration
|
||
|
|
||
|
/**
|
||
|
* @function MyEllipse
|
||
|
* @brief Draw a fixed-size ellipse with different angles
|
||
|
*/
|
||
|
//! [my_ellipse]
|
||
|
private void MyEllipse( Mat img, double angle ) {
|
||
|
int thickness = 2;
|
||
|
int lineType = 8;
|
||
|
int shift = 0;
|
||
|
|
||
|
Imgproc.ellipse( img,
|
||
|
new Point( W/2, W/2 ),
|
||
|
new Size( W/4, W/16 ),
|
||
|
angle,
|
||
|
0.0,
|
||
|
360.0,
|
||
|
new Scalar( 255, 0, 0 ),
|
||
|
thickness,
|
||
|
lineType,
|
||
|
shift );
|
||
|
}
|
||
|
//! [my_ellipse]
|
||
|
/**
|
||
|
* @function MyFilledCircle
|
||
|
* @brief Draw a fixed-size filled circle
|
||
|
*/
|
||
|
//! [my_filled_circle]
|
||
|
private void MyFilledCircle( Mat img, Point center ) {
|
||
|
int thickness = -1;
|
||
|
int lineType = 8;
|
||
|
int shift = 0;
|
||
|
|
||
|
Imgproc.circle( img,
|
||
|
center,
|
||
|
W/32,
|
||
|
new Scalar( 0, 0, 255 ),
|
||
|
thickness,
|
||
|
lineType,
|
||
|
shift );
|
||
|
}
|
||
|
//! [my_filled_circle]
|
||
|
/**
|
||
|
* @function MyPolygon
|
||
|
* @function Draw a simple concave polygon (rook)
|
||
|
*/
|
||
|
//! [my_polygon]
|
||
|
private void MyPolygon( Mat img ) {
|
||
|
int lineType = 8;
|
||
|
int shift = 0;
|
||
|
|
||
|
/** Create some points */
|
||
|
Point[] rook_points = new Point[20];
|
||
|
rook_points[0] = new Point( W/4, 7*W/8 );
|
||
|
rook_points[1] = new Point( 3*W/4, 7*W/8 );
|
||
|
rook_points[2] = new Point( 3*W/4, 13*W/16 );
|
||
|
rook_points[3] = new Point( 11*W/16, 13*W/16 );
|
||
|
rook_points[4] = new Point( 19*W/32, 3*W/8 );
|
||
|
rook_points[5] = new Point( 3*W/4, 3*W/8 );
|
||
|
rook_points[6] = new Point( 3*W/4, W/8 );
|
||
|
rook_points[7] = new Point( 26*W/40, W/8 );
|
||
|
rook_points[8] = new Point( 26*W/40, W/4 );
|
||
|
rook_points[9] = new Point( 22*W/40, W/4 );
|
||
|
rook_points[10] = new Point( 22*W/40, W/8 );
|
||
|
rook_points[11] = new Point( 18*W/40, W/8 );
|
||
|
rook_points[12] = new Point( 18*W/40, W/4 );
|
||
|
rook_points[13] = new Point( 14*W/40, W/4 );
|
||
|
rook_points[14] = new Point( 14*W/40, W/8 );
|
||
|
rook_points[15] = new Point( W/4, W/8 );
|
||
|
rook_points[16] = new Point( W/4, 3*W/8 );
|
||
|
rook_points[17] = new Point( 13*W/32, 3*W/8 );
|
||
|
rook_points[18] = new Point( 5*W/16, 13*W/16 );
|
||
|
rook_points[19] = new Point( W/4, 13*W/16 );
|
||
|
|
||
|
MatOfPoint matPt = new MatOfPoint();
|
||
|
matPt.fromArray(rook_points);
|
||
|
|
||
|
List<MatOfPoint> ppt = new ArrayList<MatOfPoint>();
|
||
|
ppt.add(matPt);
|
||
|
|
||
|
Imgproc.fillPoly(img,
|
||
|
ppt,
|
||
|
new Scalar( 255, 255, 255 ),
|
||
|
lineType,
|
||
|
shift,
|
||
|
new Point(0,0) );
|
||
|
}
|
||
|
//! [my_polygon]
|
||
|
/**
|
||
|
* @function MyLine
|
||
|
* @brief Draw a simple line
|
||
|
*/
|
||
|
//! [my_line]
|
||
|
private void MyLine( Mat img, Point start, Point end ) {
|
||
|
int thickness = 2;
|
||
|
int lineType = 8;
|
||
|
int shift = 0;
|
||
|
|
||
|
Imgproc.line( img,
|
||
|
start,
|
||
|
end,
|
||
|
new Scalar( 0, 0, 0 ),
|
||
|
thickness,
|
||
|
lineType,
|
||
|
shift );
|
||
|
}
|
||
|
//! [my_line]
|
||
|
}
|
||
|
|
||
|
public class BasicGeometricDrawing {
|
||
|
public static void main(String[] args) {
|
||
|
// Load the native library.
|
||
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||
|
new GeometricDrawingRun().run();
|
||
|
}
|
||
|
}
|