Как найти 4 угловых точки и выровнять изображение, используя преобразование перспективы OpenCV? - PullRequest
0 голосов
/ 17 мая 2019

Я новичок в OpenCV в Android, и я пытаюсь получить это изображение прямо, но безрезультатно.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;

это то, что я сделалдо сих пор, но иногда возвращается неправильно или ноль.может кто-нибудь помочь мне с этим?

что я хочу,

  • извлечь прямоугольник номерного знака и получить его 4 угловые точки
  • сделать перспективное преобразование, используя 4 угланомерного знака и сделайте его прямым
  • я хочу похожую вещь, как эта переполнение стека
...