ホームページ >バックエンド開発 >C++ >OpenCVでトリミングせずに画像を回転するにはどうすればよいですか?

OpenCVでトリミングせずに画像を回転するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-16 07:42:03847ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。