Я написал приложение для Android, используя Opencv, мой алгоритм обработки изображений нуждается в правильном повороте для моего обнаруженного прямоугольника, поэтому в начале процесса я
- обнаружил самый большой прямоугольник как
RotatedRect
. - получить угол поворота и центр прямоугольника.
- создать матрицу вращения с помощью
getRotationMatrix2D
- выполнить аффинное преобразование, используя
warpAffine
- Извлеките обнаруженный прямоугольник, используя
getRectSubPix
Процесс с отверстием работает нормально, но у меня проблема с перекосом объекта.
Когда объект вращается против часовой стрелки,коррекция перекоса работает отлично, , но , если повернуть по часовой стрелке, прямоугольник повернуть на 90 градусов.
Я должен отметить, что, поскольку камера OpenCV имеет неправильную ориентацию, я добавляю -90 ксначала угол поворота прямоугольника.
Вот мой код
/* *******************************************************************************************
* get angle and size from the rotated rect
*******************************************************************************************/
double rect_angle = rbox.angle - 90.0;
Size rect_size = rbox.size;
/* *******************************************************************************************
* correct the orientation
*******************************************************************************************/
double d = rect_size.width;
rect_size.width = rect_size.height;
rect_size.height = d;
M = Imgproc.getRotationMatrix2D(rbox.center, rect_angle, 1.0);
Imgproc.warpAffine(origMat, rotated, M, origMat.size());
/* *******************************************************************************************
* crop the resulting image
*******************************************************************************************/
if (rect_size.width > 75 && rect_size.height > 75)
Imgproc.getRectSubPix(rotated, new Size(rect_size.width - 75, rect_size.height - 75), rbox.center, rotated);
/* *******************************************************************************************
* resize the result image because rotated has the size of the rect not the original image
* which cause the preview camera to be black because of wrong dimensions
*******************************************************************************************/
Imgproc.resize(rotated, rotated, origMat.size());
Вот изображение результата, когда объект вращается по часовой стрелке
А вот и результирующее изображение с объектом, повернутым против часовой стрелки
А вот оригинальное изображение
Я должен упомянуть , что когда объект не вращается, угол составляет -90, а если он вращается по часовой стрелке, угол стремится к -179 иесли он вращается против часовой стрелки, угол становится равным -179 и стремится к -90.
Я попытался установить условие, подобное этому
if (rbox.angle < -90.0) {
rect_angle -= 90.0;
}
Но ничего не работает.
Я знаюэто вопрос математики, но я не могу найти способ достичь этого, я желаю вам, ребята, помочь мне решить эту проблему.