首页 > 后端开发 > C++ > 如何在 OpenCV 中旋转图像而不裁剪?

如何在 OpenCV 中旋转图像而不裁剪?

DDD
发布: 2024-11-16 07:42:03
原创
851 人浏览过

How to Rotate an Image in OpenCV Without Cropping?

在 OpenCV 中旋转图像而不裁剪

如果您的目标是旋转图像,同时保留其全部内容而不进行任何裁剪,OpenCV 提供一个解决方案。考虑一下传统上使用 cv::warpAffine 旋转图像的情况,但最终得到的是裁剪后的结果。本文解决了这个问题并提供了代码解决方案。

在我们的示例中,使用 cv::getRotationMatrix2D 旋转图像并使用 cv::warpAffine 应用它会生成缺少角点的图像。为了纠正这个问题,我们必须调整变换矩阵以考虑移动的图像中心。

受到相关来源见解的启发,我们的解决方案采用以下想法:

  1. 矩阵调整: 通过合并将图像的新中心与原始中心对齐的平移来修改旋转矩阵。
  2. 旋转矩形: 使用 cv::RotatedRect 确定边界矩形

我们更新的代码(使用 OpenCV 3.4.1 测试):

#include "opencv2/opencv.hpp"

int main() {
    cv::Mat src = cv::imread("im.png", CV_LOAD_IMAGE_UNCHANGED);
    double angle = -45;

    cv::Point2f center((src.cols - 1) / 2.0, (src.rows - 1) / 2.0);
    cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::Rect2f bbox = cv::RotatedRect(cv::Point2f(), src.size(), angle).boundingRect2f();
    rot.at<double>(0, 2) += bbox.width / 2.0 - src.cols / 2.0;
    rot.at<double>(1, 2) += bbox.height / 2.0 - src.rows / 2.0;

    cv::Mat dst;
    cv::warpAffine(src, dst, rot, bbox.size());
    cv::imwrite("rotated_im.png", dst);

    return 0;
}
登录后复制

此增强的代码在旋转过程中保留了原始图像的完整内容,成功实现了我们的目标是在不裁剪的情况下旋转图像。

以上是如何在 OpenCV 中旋转图像而不裁剪?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板