简体   繁体   English

在opencv c ++中向后旋转图像

[英]Rotate back an image in opencv c++

I use this code to rotate my image in OpenCV: 我使用此代码在OpenCV中旋转我的图像:

// get rotation matrix for rotating the image around its center
Point2f center22(RGBsrc.cols/2.0, RGBsrc.rows/2.0);
Mat rot = getRotationMatrix2D(center22, Angle, 1.0);
// determine bounding rectangle
Rect bbox = RotatedRect(center22,RGBsrc.size(),Angle).boundingRect();
// adjust transformation matrix
rot.at<double>(0,2) += bbox.width/2.0 - center22.x;
rot.at<double>(1,2) += bbox.height/2.0 - center22.y;
Mat dst;
warpAffine(RGBsrc, dst, rot, bbox.size());
imshow("rotated_im", dst);

It works correctly. 它工作正常。 Now I want to rotate that image back to the original image. 现在我想将该图像旋转回原始图像。 When I use the code below, I see the locations of objects in the image are not the same as in the original image. 当我使用下面的代码时,我看到图像中对象的位置与原始图像中的位置不同。 Why is this and how can I rotate my image back? 这是为什么以及如何将图像旋转回来?

Point2f center22(RGBsrc.cols/2.0, RGBsrc.rows/2.0);
Mat rot2 = getRotationMatrix2D(center22, -Angle, 1.0);
Rect bbox2 = RotatedRect(center22,RGBsrc.size(), -Angle).boundingRect();
rot2.at<double>(0,2) += bbox2.width/2.0 - center22.x;
rot2.at<double>(1,2) += bbox2.height/2.0 - center22.y;
Mat Rotatedback;
warpAffine(RotatedRGB, Rotatedback, rot2, bbox2.size());

Instead of recomputing the transformation matrix, why don't you simply take its inverse? 而不是重新计算变换矩阵,为什么不简单地采用它的逆?

// Invert the affine transformation
Mat rotInv;
cv::invertAffineTransform(rot, rotInv);

After loading your image: 加载图片后: 在此输入图像描述

You can rotate it as you're already doing: 您可以像以前一样旋转它:

// get rotation matrix for rotating the image around its center
Point2f center22(RGBsrc.cols / 2.0, RGBsrc.rows / 2.0);
Mat rot = getRotationMatrix2D(center22, Angle, 1.0);

// determine bounding rectangle
Rect bbox = RotatedRect(center22, RGBsrc.size(), Angle).boundingRect();

// adjust transformation matrix
rot.at<double>(0, 2) += bbox.width / 2.0 - center22.x;
rot.at<double>(1, 2) += bbox.height / 2.0 - center22.y;
Mat RotatedRGB;
warpAffine(RGBsrc, RotatedRGB, rot, bbox.size());

在此输入图像描述

And then compute the inverse transformation matrix and warp back: 然后计算逆变换矩阵并扭曲:

// Invert the affine transformation
Mat rotInv;
cv::invertAffineTransform(rot, rotInv);

// Get back the original image
Mat Rotatedback;
warpAffine(RotatedRGB, Rotatedback, rotInv, Size(RGBsrc.cols, RGBsrc.rows));

在此输入图像描述

Full code for reference: 完整代码供参考:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    Mat3b RGBsrc = imread("path_to_image");
    double Angle = 30.0;

    // get rotation matrix for rotating the image around its center
    Point2f center22(RGBsrc.cols / 2.0, RGBsrc.rows / 2.0);
    Mat rot = getRotationMatrix2D(center22, Angle, 1.0);

    // determine bounding rectangle
    Rect bbox = RotatedRect(center22, RGBsrc.size(), Angle).boundingRect();

    // adjust transformation matrix
    rot.at<double>(0, 2) += bbox.width / 2.0 - center22.x;
    rot.at<double>(1, 2) += bbox.height / 2.0 - center22.y;
    Mat RotatedRGB;
    warpAffine(RGBsrc, RotatedRGB, rot, bbox.size());

    // Invert the affine transformation
    Mat rotInv;
    cv::invertAffineTransform(rot, rotInv);

    // Get back the original image
    Mat Rotatedback;
    warpAffine(RotatedRGB, Rotatedback, rotInv, Size(RGBsrc.cols, RGBsrc.rows));

    imshow("Original", RGBsrc);
    imshow("Rotated", RotatedRGB);
    imshow("Rotated Back", Rotatedback);
    waitKey();

    return 0;
}

If you add the WARP_INVERSE_MAP flag when calling warpAffine() , it will apply the inverse transform matrix, getting you back to your original image. 如果在调用warpAffine()时添加WARP_INVERSE_MAP标志,它将应用逆变换矩阵,使您返回原始图像。 For example, you should be able to replace the last line of code in your question with something like the following: 例如,您应该能够使用以下内容替换问题中的最后一行代码:

warpAffine(RotatedRGB, Rotatedback, rot, RGBsrc.size(), INTER_LINEAR|WARP_INVERSE_MAP);

Note: I haven't tested this code, but I have used WARP_INVERSE_MAP to do the same thing with warpPerspective() and it worked perfectly. 注意:我没有测试过这段代码,但是我使用WARP_INVERSE_MAPwarpPerspective()做了同样的事情,并且它运行得很好。

Documentation: https://docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#ga0203d9ee5fcd28d40dbc4a1ea4451983 文档: https//docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#ga0203d9ee5fcd28d40dbc4a1ea4451983

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM