为什么这个旋转方法会给图像带来死空间? OpenCV的

时间:2014-04-18 05:09:12

标签: ios image opencv rotation

我正在使用这种方法来旋转cvMat,每当我运行它时,我都会返回一个旋转的图像,但是它下面有很多死区。

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

}

给出这张图片时:

enter image description here

我得到这张图片:

enter image description here

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

方法调用:

rotate(src, skew, res); resdst

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

所以你必须这样做,

  • 创建比你的光源稍大的白色图像,它取决于你的倾斜角度,这里我使用了50像素。

    int extend=50;
    Mat tmp(src.rows+2*extend,src.cols+2*extend,src.type(),Scalar::all(255));
    
  • 使用投资回报率将来源复制到上方

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

enter image description here