检测图像中的矩形并使用android中的open cv绘制轮廓

时间:2013-05-29 06:39:49

标签: android opencv

我正在开发应用程序,我必须检测矩形对象并绘制轮廓我正在使用Open cv android库....

我成功检测到圆形并在图像内部绘制轮廓但反复无法检测到方形或矩形并绘制....这是我的圆形代码..

Bitmap imageBmp = BitmapFactory.decodeResource(MainActivityPDF.this.getResources(),R.drawable.loadingplashscreen);

Mat imgSource = new Mat(), imgCirclesOut = new Mat();

Utils.bitmapToMat(imageBmp , imgSource);

    //grey opencv
Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BGR2GRAY);

Imgproc.GaussianBlur( imgSource, imgSource, new Size(9, 9), 2, 2 );
Imgproc.HoughCircles( imgSource, imgCirclesOut, Imgproc.CV_HOUGH_GRADIENT, 1, imgSource.rows()/8, 200, 100, 0, 0 );

float circle[] = new float[3];

for (int i = 0; i < imgCirclesOut.cols(); i++)
{
        imgCirclesOut.get(0, i, circle);
    org.opencv.core.Point center = new org.opencv.core.Point();
    center.x = circle[0];
    center.y = circle[1];
    Core.circle(imgSource, center, (int) circle[2], new Scalar(255,0,0,255), 4);
    }
    Bitmap bmp = Bitmap.createBitmap(imageBmp.getWidth(), imageBmp.getHeight(), Bitmap.Config.ARGB_8888);

    Utils.matToBitmap(imgSource, bmp);


    ImageView frame = (ImageView) findViewById(R.id.imageView1);

    //Bitmap bmp = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    frame.setImageBitmap(bmp);

为android检测方形/矩形的任何帮助......我想知道2天..每个例子都是在C ++或C ++中我无法通过那些语言......

感谢。

2 个答案:

答案 0 :(得分:0)

使用Houghtransformation你是正确的方法。您必须使用Houghlines并检查所获得的交叉线,而不是使用Houghcircles。如果你真的必须找到矩形(而不是4边多边形) - 你应该寻找具有相同角度的线(+ - 一个小的偏移量),如果你找到至少一对这些线,你必须寻找线垂直于此,找到一对并检查交叉点。使用矢量(端点 - 起点)和线来执行角度和交叉测试应该不是什么大问题。

答案 1 :(得分:0)

有很多使用opencv检测矩形的方法,最合适的方法是在应用Canny Edge Detection之后找到轮廓。

步骤如下:- 1.将图像转换为MAT

  1. 灰度图像

3。应用高斯模糊

4。应用形态学填充空洞

5。应用Canny检测

6。找到图像的轮廓线

7。找到其余部分的最大轮廓

8。绘制最大轮廓。

代码如下- 1.将图像转换为MAT

Utils.bitmapToMat(image,src)
  1. 灰度图像
val gray = Mat(src.rows(), src.cols(), src.type())
  Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY)

3。应用高斯模糊

Imgproc.GaussianBlur(gray, gray, Size(5.0, 5.0), 0.0)

4。应用形态学来填充孔(如果有的话)并扩大图像

       val kernel = Imgproc.getStructuringElement(
           Imgproc.MORPH_ELLIPSE, Size(
               5.0,
               5.0
           )
       )
       Imgproc.morphologyEx(
           gray,
           gray,
           Imgproc.MORPH_CLOSE,
           kernel
       ) // fill holes
       Imgproc.morphologyEx(
           gray,
           gray,
           Imgproc.MORPH_OPEN,
           kernel
       ) //remove noise
       Imgproc.dilate(gray, gray, kernel)

5。应用Canny检测

   val edges = Mat(src.rows(), src.cols(), src.type())
   Imgproc.Canny(gray, edges, 75.0, 200.0)

6。找到图像的轮廓线

   val contours = ArrayList<MatOfPoint>()
        val hierarchy = Mat()
        Imgproc.findContours(
            edges, contours, hierarchy, Imgproc.RETR_LIST,
            Imgproc.CHAIN_APPROX_SIMPLE
        )

7。找到其余部分的最大轮廓

  public int findLargestContour(ArrayList<MatOfPoint> contours) {

        double maxVal = 0;
        int maxValIdx = 0;
        for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
            double contourArea = Imgproc.contourArea(contours.get(contourIdx));
            if (maxVal < contourArea) {
                maxVal = contourArea;
                maxValIdx = contourIdx;
            }
        }


        return maxValIdx;

    }

8。绘制最大的轮廓即矩形

  Imgproc.drawContours(src, contours, idx, Scalar(0.0, 255.0, 0.0), 3)

在这里,您已经找到了矩形。 如果在执行此过程时仍然存在任何错误,请尝试将源图像的大小调整为其高度和宽度的一半。

在下面的链接中可以找到上述正确的Java代码 https://github.com/dhananjay-91/DetectRectangle 也, https://github.com/aashari/android-opencv-rectangle-detector