OpenCV Birdseye view без потери данных

Я использую OpenCV, чтобы получить вид с высоты птичьего полета на захваченные кадры. Это делается путем предоставления шахматной доски на плоскости, которая будет формировать вид с высоты птичьего полета.

Хотя кажется, что камера уже довольно хороша на вершине этой равнины, мне нужно, чтобы она была идеальной, чтобы определить соотношение между пикселями и сантиметрами.

На следующем этапе кадры захвата деформируются. Это дает ожидаемый результат:

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

Вопрос: Как повернуть изображение на угол камеры, чтобы оно было сверху вниз?

Некоторый код для иллюстрации того, что я сейчас делаю:

Size chessboardSize = new Size(12, 8); // Size of the chessboard

Size captureSize = new Size(1920, 1080); // Size of the captured frames

Size viewSize = new Size((chessboardSize.width / chessboardSize.height) * captureSize.height, captureSize.height); // Size of the view

MatOfPoint2f imageCorners; // Contains the imageCorners obtained in a earlier stage

Mat H; // Homography

Код, который находит углы:

Mat grayImage = new Mat();
//Imgproc.resize(source, temp, new Size(source.width(), source.height()));
Imgproc.cvtColor(source, grayImage, Imgproc.COLOR_BGR2GRAY);
Imgproc.threshold(grayImage, grayImage, 0.0, 255.0, Imgproc.THRESH_OTSU);
imageCorners = new MatOfPoint2f();
Imgproc.GaussianBlur(grayImage, grayImage, new Size(5, 5), 5); 
boolean found = Calib3d.findChessboardCorners(grayImage, chessboardSize, imageCorners, Calib3d.CALIB_CB_NORMALIZE_IMAGE + Calib3d.CALIB_CB_ADAPTIVE_THRESH + Calib3d.CALIB_CB_FILTER_QUADS);

if (found) {

    determineHomography();
}

Код, который определяет гомографию:

Point[] data = imageCorners.toArray();

if (data.length < chessboardSize.area()) {
    return;
}

Point[] roi = new Point[] {

    data[0 * (int)chessboardSize.width - 0], // Top left
    data[1 * (int)chessboardSize.width - 1], // Top right
    data[((int)chessboardSize.height - 1) * (int)chessboardSize.width - 0], // Bottom left
    data[((int)chessboardSize.height - 0) * (int)chessboardSize.width - 1], // Bottom right
};

Point[] roo = new Point[] {
    new Point(0, 0),
    new Point(viewSize.width, 0),
    new Point(0, viewSize.height),
    new Point(viewSize.width, viewSize.height)
};

MatOfPoint2f objectPoints = new MatOfPoint2f(), imagePoints = new MatOfPoint2f();

objectPoints.fromArray(roo);
imagePoints.fromArray(roi);

Mat H = Imgproc.getPerspectiveTransform(imagePoints, objectPoints);

Наконец, захваченные кадры деформируются:

Imgproc.warpPerspective(capture, view, H, viewSize);

Ответы на вопрос(1)

Ваш ответ на вопрос