gpt4 book ai didi

c++ - 在 C++ 中的 OpenCV 中旋转图像而不进行裁剪

转载 作者:IT老高 更新时间:2023-10-28 14:01:40 24 4
gpt4 key购买 nike

我想旋转一张图片,但是不裁剪就无法获得旋转后的图片

我的原图:

enter image description here

现在我使用这个代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

// Compile with g++ code.cpp -lopencv_core -lopencv_highgui -lopencv_imgproc

int main()
{
cv::Mat src = cv::imread("im.png", CV_LOAD_IMAGE_UNCHANGED);
cv::Mat dst;

cv::Point2f pc(src.cols/2., src.rows/2.);
cv::Mat r = cv::getRotationMatrix2D(pc, -45, 1.0);

cv::warpAffine(src, dst, r, src.size()); // what size I should use?

cv::imwrite("rotated_im.png", dst);

return 0;
}

并获取如下图片:

enter image description here

但我想得到这个:

enter image description here

最佳答案

我的回答受到以下帖子/博客条目的启发:

主要思想:

  • 通过向新图像中心添加平移来调整旋转矩阵
  • 使用cv::RotatedRect尽可能依赖已有的opencv功能

使用 opencv 3.4.1 测试的代码:

#include "opencv2/opencv.hpp"

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

// get rotation matrix for rotating the image around its center in pixel coordinates
cv::Point2f center((src.cols-1)/2.0, (src.rows-1)/2.0);
cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
// determine bounding rectangle, center not relevant
cv::Rect2f bbox = cv::RotatedRect(cv::Point2f(), src.size(), angle).boundingRect2f();
// adjust transformation matrix
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;
}

关于c++ - 在 C++ 中的 OpenCV 中旋转图像而不进行裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22041699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com