如何使用OpenCV透视变换找到4个角点并弄平图像?

时间:2019-05-17 09:29:43

标签: java android opencv4android

我是android的OpenCV的新手,我试图使该图像笔直,但没有结果。 enter image description here

到目前为止我已经完成的步骤

1。

//convert the image to gray scale
 Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);

2。

//blur the image
Imgproc.GaussianBlur(imgGray, imgGaussianBlur, new Size(3, 3), 0);

3。

//sobel filter
Imgproc.Sobel(imgGaussianBlur, imgSobel, -1, 1, 0);

4。

// Thresholding the image
Imgproc.adaptiveThreshold(imgSobel, imgAdaptiveThreshold, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 99, 4);

5。

Mat element = getStructuringElement(MORPH_RECT, new Size(18, 4));
            Imgproc.morphologyEx(imgAdaptiveThreshold, imgMoprhological, CV_MOP_CLOSE, element); //или imgThreshold
            //Imgcodecs.imwrite("changes/st/6_imgMoprhologicald.png", imgMoprhological);

            imgContours = imgMoprhological.clone();
            Imgproc.findContours(imgContours,
                    contours,
                    new Mat(),
                    Imgproc.RETR_LIST,
                    Imgproc.CHAIN_APPROX_SIMPLE);

6。

 imgMinAreaRect = img1.clone();
        if (contours.size() > 0) {
            for (MatOfPoint matOfPoint : contours) {
                MatOfPoint2f points = new MatOfPoint2f(matOfPoint.toArray());

                RotatedRect box = Imgproc.minAreaRect(points);
                if (checkImageRatio(box)) {
                    Imgproc.rectangle(imgMinAreaRect, box.boundingRect().tl(), box.boundingRect().br(), new Scalar(0, 0, 255));
                    imgDetectedPlateCandidate = new Mat(imgAdaptiveThreshold_forCrop, box.boundingRect());
                    if (checkDensity(imgDetectedPlateCandidate))
                        imgDetectedPlateTrue = imgDetectedPlateCandidate.clone();
                } else
                    Imgproc.rectangle(imgMinAreaRect, box.boundingRect().tl(), box.boundingRect().br(), new Scalar(0, 255, 0));
            }
        }


        image1 = Bitmap.createBitmap(imgDetectedPlateTrue.cols(), imgDetectedPlateTrue.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(imgDetectedPlateTrue, image1);

        return image1;

这是我到目前为止所做的,但是有时返回错误或为null。 有人可以帮我吗?

我想要的是

  • 提取车牌矩形并获得其4个角点
  • 使用车牌的四个角进行透视变换并使其笔直
  • 我想要类似stack overflow 的东西

0 个答案:

没有答案