Maison  >  Article  >  développement back-end  >  Comment faire pivoter une image dans OpenCV sans recadrer ?

Comment faire pivoter une image dans OpenCV sans recadrer ?

DDD
DDDoriginal
2024-11-16 07:42:03764parcourir

How to Rotate an Image in OpenCV Without Cropping?

Faire pivoter une image sans recadrage dans OpenCV

Si votre objectif est de faire pivoter une image tout en préservant l'intégralité de son contenu sans aucun recadrage, OpenCV fournit une solution. Considérez la situation où vous faites pivoter une image traditionnellement à l'aide de cv::warpAffine, pour finalement obtenir un résultat recadré. Cet article résout ce problème et fournit une solution de code.

Dans notre exemple, faire pivoter l'image à l'aide de cv::getRotationMatrix2D et l'appliquer avec cv::warpAffine donne une image avec des coins manquants. Pour remédier à cela, nous devons ajuster la matrice de transformation pour tenir compte du centre de l'image décalé.

Inspirée par des informations provenant de sources connexes, notre solution utilise les idées suivantes :

  1. Ajustement de la matrice : Modifiez la matrice de rotation en incorporant une translation qui aligne le nouveau centre de l'image avec le centre d'origine.
  2. Rectangle pivoté : Utilisez cv::RotatedRect pour déterminer le rectangle englobant qui englobe l'image pivotée.

Notre code mis à jour (testé avec 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;
}

Ce code amélioré préserve l'intégralité du contenu de l'image originale pendant la rotation, réalisant ainsi notre objectif de faire pivoter une image sans recadrage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn