我正在使用这种方法来旋转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));
}
给出这张图片时:
我得到这张图片:
图像已经旋转但是你可以看到添加了一些额外的像素,我怎么只能旋转原始图像而不添加任何额外的像素?
方法调用:
rotate(src, skew, res);
res
为dst
。
答案 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);