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 :
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!