OpenCV でトリミングせずに画像を回転する
目的が、トリミングせずにコンテンツ全体を保持しながら画像を回転することである場合、OpenCV は次の機能を提供します解決策。従来のように cv::warpAffine を使用して画像を回転した結果、結果がトリミングされてしまう状況を考えてみましょう。この記事では、この問題に対処し、コードによる解決策を提供します。
この例では、cv::getRotationMatrix2D を使用して画像を回転し、それを cv::warpAffine で適用すると、角が欠けた画像が生成されます。これを修正するには、画像中心のシフトを考慮して変換行列を調整する必要があります。
関連ソースからの洞察に触発された私たちのソリューションは、次のアイデアを利用しています:
更新されたコード (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 サイトの他の関連記事を参照してください。