Я пытаюсь сделать перевод, вращение и масштабирование с точностью до субпикселя в 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?
или же
Существуют ли идеи или коды для масштабирования и поворота изображения с точностью до субпикселя (например, код, предоставленный для перевода изображения в указанной ссылке)?
Буду признателен за любые идеи.
Задача ещё не решена.
Других решений пока нет …