Java example demonstrating canny edge detection in OpenCV.

JavaObject Oriented ProgrammingProgramming

The canny edge detector is known as optimal detector since it detects only the existing edges, gives only one response per page and minimizes the distance between the edge pixels and detected pixels.

The Canny() method of the Imgproc class applies the canny edge detection algorithm on the given image. this method accepts −

  • Two Mat objects representing the source and destination images.

  • Two double variables to hold the threshold values.

To detect the edges of a given image using the canny edge detector −

  • Read the contents of the source image using the imread() method of the Imgcodecs class.

  • Convert it into a gray scale image using the cvtColor() method of the Imgproc class.

  • Blur the resultant (gray) image using the blur() method of the Imgproc class with kernel value 3.

  • Apply canny edge detection algorithm on the blurred image using the canny() method of the Imgproc.

  • Create an empty matrix with all values as 0.

  • Add the detected edges to it using the copyTo() method of the Mat class.


import java.awt.Image;
import java.awt.image.BufferedImage;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class EdgeDetection extends Application {
   public void start(Stage stage) throws IOException {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      String file ="D:\Images\win2.jpg";
      Mat src = Imgcodecs.imread(file);
      //Creating an empty matrices to store edges, source, destination
      Mat gray = new Mat(src.rows(), src.cols(), src.type());
      Mat edges = new Mat(src.rows(), src.cols(), src.type());
      Mat dst = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
      //Converting the image to Gray
      Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
      //Blurring the image
      Imgproc.blur(gray, edges, new Size(3, 3));
      //Detecting the edges
      Imgproc.Canny(edges, edges, 100, 100*3);
      //Copying the detected edges to the destination matrix
      src.copyTo(dst, edges);      
      //Converting matrix to JavaFX writable image
      Image img = HighGui.toBufferedImage(dst);
      WritableImage writableImage= SwingFXUtils.toFXImage((BufferedImage) img, null);
      //Setting the image view
      ImageView imageView = new ImageView(writableImage);
      //Setting the Scene object
      Group root = new Group(imageView);
      Scene scene = new Scene(root, 595, 400);
      stage.setTitle("Gaussian Blur Example");
   public static void main(String args[]) {

Input Image


On executing, the above produces the following output −

Updated on 13-Apr-2020 09:28:20