Как исправить перекос RotatedRect с помощью OpenCV? - PullRequest
1 голос
/ 03 апреля 2019

Я написал приложение для Android, используя Opencv, мой алгоритм обработки изображений нуждается в правильном повороте для моего обнаруженного прямоугольника, поэтому в начале процесса я

  1. обнаружил самый большой прямоугольник как RotatedRect.
  2. получить угол поворота и центр прямоугольника.
  3. создать матрицу вращения с помощью getRotationMatrix2D
  4. выполнить аффинное преобразование, используя warpAffine
  5. Извлеките обнаруженный прямоугольник, используя 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());

Вот изображение результата, когда объект вращается по часовой стрелке

enter image description here

А вот и результирующее изображение с объектом, повернутым против часовой стрелки

enter image description here

А вот оригинальное изображение

enter image description here

Я должен упомянуть , что когда объект не вращается, угол составляет -90, а если он вращается по часовой стрелке, угол стремится к -179 иесли он вращается против часовой стрелки, угол становится равным -179 и стремится к -90.

Я попытался установить условие, подобное этому

if (rbox.angle < -90.0) {
  rect_angle -= 90.0;
}

Но ничего не работает.

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

1 Ответ

0 голосов
/ 03 апреля 2019

Для всех, кто интересуется ответом, я нашел решение.

Я работал над шириной и высотой обнаруженного прямоугольника вместо угла.

Поэтому перед созданием матрицы вращения ядобавил этот тестовый код

if (rbox.size.width < rbox.size.height) {
         rect_angle += 90.0;
         double d1 = rect_size.height;
         rect_size.height = rect_size.width;
         rect_size.width = d1;
}
...