首頁 >後端開發 >C++ >如何在 OpenCV 中旋轉影像而不裁剪?

如何在 OpenCV 中旋轉影像而不裁剪?

DDD
DDD原創
2024-11-16 07:42:03845瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn