我正在使用这种方法来旋转一个 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));
}
当给出这张图片时:
我得到这张图片:
图像已经旋转,但是你可以看到已经添加了一些额外的像素,我怎样才能只旋转原始图像而不添加任何额外的像素?
方法调用:
旋转(src, skew, res);
res
为 dst
。
最佳答案
正如 mayank-baddi 所说,你必须使用与输入相同的输出图像大小来解决这个问题,我的回答是基于你上面的评论 我如何避免添加黑色区域?
在 wrapAffine 之后,
所以你必须这样做,
创建比您的源大一点的白色图像,这将取决于您的倾斜角度,这里我使用了 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);
关于ios - 为什么这种旋转方法会给图像带来死角?打开简历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23147752/