Houghlines in android with opencv

2020-07-22 09:39发布

问题:

I am trying to make a perspective correction for quadrilateral objects using opencv3. I managed to show the lines and also implemented the Houghlines using Imgproc.HoughLinesP() and tried to highlight the lines using Imgproc.lines() but output was no success. Below is my code and also I have attached my output image.

Please let me know what is wrong happening and what should be done...

Mat initImg; // initial image
Mat greyImg; // converted to grey

Mat lines = new Mat();
int threshold = 50;
int minLineSize = 20;
int lineGap = 10;

initImg = Imgcodecs.imread(imgLoc, 1);
greyImg = new Mat();
Imgproc.cvtColor(initImg, greyImg, Imgproc.COLOR_BGR2GRAY);
Bitmap bitm = Bitmap.createBitmap(greyImg.cols(), greyImg.rows(),Bitmap.Config.ARGB_8888);

Imgproc.blur(greyImg, greyImg, new Size(3.d, 3.d));
Imgproc.adaptiveThreshold(greyImg, greyImg, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);

Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
        minLineSize, lineGap);
// lines returns rows x columns and rows is always 1. I dont know why please help me to understand
for (int x = 0; x < lines.cols(); x++) {

    double[] vec = lines.get(0, x);
    double[] val = new double[4];

    double x1 = vec[0],
            y1 = vec[1],
            x2 = vec[2],
            y2 = vec[3];

    System.out.println(TAG+"Coordinates: x1=>"+x1+" y1=>"+y1+" x2=>"+x2+" y2=>"+y2);
    Point start = new Point(x1, y1);
    Point end = new Point(x2, y2);

    Imgproc.line(greyImg, start, end, new Scalar(0,255, 0, 255), 3);

}

Utils.matToBitmap(greyImg, bitm);

if(bitm!=null){
    Toast.makeText(getApplicationContext(), "Bitmap not null", Toast.LENGTH_SHORT).show();
    iv.setImageBitmap(bitm);
}else{
    Toast.makeText(getApplicationContext(), "Bitmap null", Toast.LENGTH_SHORT).show();
}

My Output:

回答1:

I finally managed to get the houghlines. The houghlines was not showing in the grey images and I extracted the houghlines in grey image but plotted the lines in color image and it worked.

Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
                minLineSize, lineGap);

        for (int x = 0; x < lines.rows(); x++)
        {
            double[] vec = lines.get(x, 0);
            double x1 = vec[0],
                    y1 = vec[1],
                    x2 = vec[2],
                    y2 = vec[3];
            Point start = new Point(x1, y1);
            Point end = new Point(x2, y2);
            double dx = x1 - x2;
            double dy = y1 - y2;

            double dist = Math.sqrt (dx*dx + dy*dy);

            if(dist>300.d)  // show those lines that have length greater than 300
                Imgproc.line(initImg, start, end, new Scalar(0,255, 0, 255),5);// here initimg is the original image.

        }