Выполнение перевода, вращения и масштабирования изображения с небольшими шагами и точностью до субпикселя в C++ с openCV

Я пытаюсь сделать перевод, вращение и масштабирование с точностью до субпикселя в openCV.

Это ссылка для выполнения перевода с субпиксельной pecision:

Перевести изображение с помощью OpenCV в C++

Итак, мне нужно сделать то же самое для масштабирования и поворота, например, когда я поворачиваю изображение на 2 градуса, оно работает, но когда я поворачиваю его на 1 или ниже 1 градуса, оно не работает, а результат поворота на 2 градуса так же, как вращение на 2,1 градуса!

В предоставленной ссылке упоминается, что я мог бы повысить точность, изменив следующий код внутри imgproc.hpp

enum InterpolationMasks {
       INTER_BITS      = 5,
       INTER_BITS2     = INTER_BITS * 2,
       INTER_TAB_SIZE  = 1 << INTER_BITS,
       INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE
      };

Вот пример для поворота: Исходное изображение выглядит следующим образом:

0  0   0  0
0 255 255 0
0 255 255 0
0  0   0  0

Я делаю вращение относительно центра изображения.

Для поворота на 1 градус результат совпадает с исходным изображением!

И для вращения на 2 градуса результат такой же, как и на 2,1 градуса (чего не должно быть)!

Вот код:

Mat rotateImage(Mat sourceImage, double rotationDegree){

    Mat rotationMatrix, rotatedImage;
    double rowOfImgCenter, colOfImgCenter;
    rowOfImgCenter = scaledImage.rows / 2.0 - 0.5;
    colOfImgCenter = scaledImage.cols / 2.0 - 0.5;
    Point2d imageCenter(colOfImgCenter, rowOfImgCenter);
    rotationMatrix = getRotationMatrix2D(imageCenter, rotationDegree, 1.0);
    warpAffine(scaledImage, rotatedImage, rotationMatrix, scaledImage.size(), INTER_AREA);

    return rotatedImage;
}

Когда я проверяю предоставленный код перевода, он работает с точностью 1e-7, но когда я делаю перевод в столбце к 1e-8, он дает мне исходное изображение вместо его перевода (что не правильно), когда я делаю код в Matlab дает мне следующий результат, который является правильным (я хочу получить тот же результат с хорошей точностью в C++):

0          0                       0                 0
0   2.5499999745e+02              255       2.549999976508843e-06
0   2.5499999745e+02              255       2.549999976508843e-06    
0          0                       0                 0 

Также для поворота, когда я поворачиваю изображение на 1 градус, результат должен выглядеть следующим образом (это то, что я получил в matlab и хочу получить тот же результат в C++) (мне пришлось удалить некоторые числа (уменьшить точность), чтобы матрица могла бы вписаться сюда)

0                   0               1.1557313           0
1.1557313    2.5497614e+02          2.549761e+02        0
0            2.5497614e+02          2.549761e+02     1.1557313       
0            1.1557313                  0               0

Теперь мой вопрос заключается в том, как я могу увеличить субпиксельную точность в openCV? или есть ли какие-либо идеи или коды для масштабирования и поворота изображения с точностью до субпикселя (например, код, предоставленный для перевода изображения в указанной ссылке)?

Буду признателен за любые идеи.

0 ответов

Другие вопросы по тегам