【问题标题】:how to imRotate with OpenCV 2.4.3?如何使用 OpenCV 2.4.3 imRotate?
【发布时间】:2013-01-29 23:24:22
【问题描述】:

如何使用 OpenCV 2.4.3 实现 imrotate(Mat src,Mat dst,double angle)? 有一个函数 warpAffine() 但它做的更多而且令人困惑。它会裁剪超出范围的内容。

我想让它的画布更大,以适应一切。并用黑色填充空白处。

【问题讨论】:

  • 我使用的是 c++ opencv 2.4.3。
  • 你检查过opencv教程吗?它说要找到所需角度的旋转矩阵,然后使用变形仿射。还不够吗?
  • 实际上它在旋转后裁剪了我的边缘。我想要一个更大的画布来适应所有东西并在空白处添加黑色。
  • 您可以编写自己的函数“imrotate”,它实际上创建了一个大画布(可能是图像对角线长度的大小)并在其上旋转图像并使用该函数。

标签: c++ opencv image-processing rotation


【解决方案1】:

使用copyMakeBorder 和scalarAll(0) 作为原始图像,然后使用旋转矩阵并使用warpAffine 进行变换。边框应该足够大以包含旋转后的图像。将warpAffineCV_WARP_FILL_OUTLIERS 一起使用,再次与scalarAll(0) 一起使用

【讨论】:

    【解决方案2】:

    我是这样解决的。谢谢你的回答。

    Mat rotateImage(const Mat source, double angle,int border=20)
    {
        Mat bordered_source;
        int top,bottom,left,right;
        top=bottom=left=right=border;
        copyMakeBorder( source, bordered_source, top, bottom, left, right, BORDER_CONSTANT,cv::Scalar() );
        Point2f src_center(bordered_source.cols/2.0F, bordered_source.rows/2.0F);
        Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0);
        Mat dst;
        warpAffine(bordered_source, dst, rot_mat, bordered_source.size());  
        return dst;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多