Thursday, 15 March 2018

algorithm - Java OpenCV - Rectangle Detection with Hough Transform

I'm developing a program to detect rectangular shape and draw bounding box to the detected area.



For edge detection, I used Canny Edge Detection.
Then, I use Hough Transform to extract lines.



This is the original image
enter image description here



This is the result image
enter image description here




My problem is that I can't draw a bounding box to the detected area.
It seems that my program can only detect a single horizontal line.
How can I detect rectangle shape and draw rectangle line to the detected shape?



I've read similar problems and it is required to find the 4 corner points of the rectangle, check if the point is 90 degree, and find the intersection. I'm really confused how to code it in Java opencv. Other methods to detect the shape and draw bounding box to the detected would be okay too.



Here's the code



import org.opencv.core.Core;

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.*;
import org.opencv.imgproc.Imgproc;

public class HoughTransformCV2 {


public static void main(String[] args) {
try {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source = Imgcodecs.imread("rectangle.jpg", Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());

Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);
Imgproc.equalizeHist(destination, destination);
Imgproc.GaussianBlur(destination, destination, new Size(5, 5), 0, 0, Core.BORDER_DEFAULT);


Imgproc.Canny(destination, destination, 50, 100);
//Imgproc.adaptiveThreshold(destination, destination, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 15, 40);
Imgproc.threshold(destination, destination, 0, 255, Imgproc.THRESH_BINARY);

if (destination != null) {
Mat lines = new Mat();
Imgproc.HoughLinesP(destination, lines, 1, Math.PI / 180, 50, 30, 10);
Mat houghLines = new Mat();
houghLines.create(destination.rows(), destination.cols(), CvType.CV_8UC1);


//Drawing lines on the image
for (int i = 0; i < lines.cols(); i++) {
double[] points = lines.get(0, i);
double x1, y1, x2, y2;
x1 = points[0];
y1 = points[1];
x2 = points[2];
y2 = points[3];

Point pt1 = new Point(x1, y1);

Point pt2 = new Point(x2, y2);

//Drawing lines on an image
Imgproc.line(source, pt1, pt2, new Scalar(0, 0, 255), 4);
}

}

Imgcodecs.imwrite("rectangle_houghtransform.jpg", source);


} catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
}
}


Any help in Java would be appreciated :)
Thank you very much!

No comments:

Post a Comment

casting - Why wasn&#39;t Tobey Maguire in The Amazing Spider-Man? - Movies &amp; TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...