为什么这个旋转方法给图像死angular? OpenCV的

我使用这种方法来旋转一个cvMat ,每当我运行它我得到一个旋转的图像,但是有很多deadspace下面。

 void rotate(cv::Mat& src, double angle, cv::Mat& dst) { int len = std::max(src.cols, src.rows); cv::Point2f pt(len/2., len/2.); cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0); cv::warpAffine(src, dst, r, cv::Size(len, len)); } 

当给这个图像:

在这里输入图像说明

我得到这个图像:

在这里输入图像说明

图像已被旋转,但你可以看到一些额外的像素已被添加,我怎么只能旋转原始图像,而不是添加任何额外的像素?

方法调用:

rotate(src, skew, res); resdst

由于mayank-baddi说你必须使用与input相同的输出图像大小来解决这个问题,我的回答是基于你上面的评论How can I avoid adding the black area? wrapAffine之后,

所以你必须这样做,

  • 创造比你的来源稍大的白色图像,这取决于你的倾斜angular度,在这里我使用了50像素。

     int extend=50; Mat tmp(src.rows+2*extend,src.cols+2*extend,src.type(),Scalar::all(255)); 
  • 使用ROI将源复制到上面

     Rect ROI(extend,extend,src.cols,src.rows); src.copyTo(tmp(ROI)); 
  • 现在旋转tmp而不是src

     rotate(tmp, skew, res); res being dst. 
  • 使用相同的ROI从旋转后的结果中裁剪出最终的图像。

      Mat crop=res(ROI); imshow("crop",crop); 

在这里输入图像说明

您必须在使用warpAffine转换时定义输出图像大小。 这里你定义了cv::Size(len, len)其中len是高度和宽度的最大值。

 cv::warpAffine(src, dst, r, cv::Size(len, len)); 

相应地定义/计算最终图像的大小。