OpencCv - сопоставить пиксель с новым местоположением после `warpAffine` или` warpPerspective` (проективное преобразование / морфологические операции) - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть следующий код:

        Rect rect = Imgproc.boundingRect(screenCnt2f);

        // do transpose
        Mat destImage = new Mat(new Size(rect.width, rect.height), orig.type());
        Mat src = orderPointsClockwise(screenCnt2f);
        dst = new MatOfPoint2f(new Point(0, 0), new Point(rect.width - 1, 0),
                new Point(rect.width - 1, rect.height - 1), new Point(0, rect.height - 1));
        Mat transform = Imgproc.getPerspectiveTransform(src, dst);
        Imgproc.warpPerspective(orig, destImage, transform, destImage.size());

Если у меня есть пиксель в местоположении x, y,

Как я могу вычислить местоположение того же пикселя в destImage?

Так что, если Point p содержит значения x, y, я бы хотел метод newPointLocation:

Point pp = newPointLocation(p, tranform);

, чтобы pp содержал тот же пиксель в destImage

Тот же код с warpAffine:

    Point center = new Point(src.width() / 2, src.height() / 2);
    Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1.0);
    // 1.0 means 100 % scale
    Size size = new Size(src.width(), src.height());
    Imgproc.warpAffine(src, src, rotImage, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS);

Point pp = newPointLocation(p, rotImage);

1 Ответ

1 голос
/ 09 февраля 2020

Вы можете сделать это с помощью Core.transform(matOfPoint, dst, rotImage)

Код:

    Point center = new Point(source.width() / 2, source.height() / 2);
    Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1.0);
    // 1.0 means 100 % scale
    Size size = new Size(source.width(), source.height());
    Imgproc.warpAffine(source, source, rotImage, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS);

    // calculate new bounding box location
    // zBoundingBox contain the matOfPoint that describe the bounding box in the Orig location
    for (ZBoundingBox zBoundingBox : boundingBoxesOrig) {
        MatOfPoint matOfPoint = zBoundingBox.matOfPoint, dst = new MatOfPoint();
        Core.transform(matOfPoint, dst, rotImage);
        boundingBoxes.add(dst); // Add to predefined collection 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...