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 ppt = new ArrayList(); 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(); } }