如何使用OpenCV纠正RotatedRect偏斜?

时间:2019-04-03 09:37:53

标签: android opencv image-processing computer-vision opencv4android

我使用Opencv编写了一个Android应用程序,我的图像处理算法需要针对检测到的矩形进行正确的旋转,因此,作为过程的开始,我

  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 :(得分:0)

对于关心答案的每个人,我都找到了解决方案。

我处理检测到的矩形的宽度和高度,而不是角度。

所以在创建旋转矩阵之前,我添加了此测试代码

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;
}