在 opencv 中结合旋转和平移,一次通过 [英] Combine rotation and translation in opencv, in one pass

查看:72
本文介绍了在 opencv 中结合旋转和平移,一次通过的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一段用于旋转和平移图像的代码:

I have a piece of code for rotating and translating image:

Point2f pt(0, in.rows);
double angle = atan(trans.c / trans.b) * 180 / M_PI;
Mat r = getRotationMatrix2D(pt, -angle, 1.0);
warpAffine(in, out, r, in.size(), interpolation); /* rotation */

Mat t = (Mat_<double>(2, 3) << 1, 0, trans.a, 0, 1, -trans.d);
warpAffine(out, out, t, in.size(), interpolation); /* translation */

问题是我要分两次这样做.因此,例如,如果我的角度为 90 度,则第一个输出"变量将为空,因为所有数据都超出范围.有没有办法一次性完成?为了避免丢失我的数据和出现黑色图像.

The problem is that I'm doing this in two times. So if I have an angle of 90degree for example, the first "out" variable will be empty because all data are out of bounds. Is there a way to do it in one pass ? In order to avoid loosing my data and having black image.

我认为最好的办法是将 r 和 t 组合在一个矩阵中,但我有点迷茫.

I think that the best thing would be to combine r and t in one matrix but I'm a little lost.

最好的问候,

推荐答案

这是一个关于如何通过简单乘法组合 2 个单应性以及如何从 3x3 单应性中提取仿射变换的示例.

Here is an example on how to combine 2 homographies by simple multiplication and how to extract an affine transformation from a 3x3 homography.

int main(int argc, char* argv[])
{
    cv::Mat input = cv::imread("C:/StackOverflow/Input/Lenna.png");

    // create to 3x3 identity homography matrices
    cv::Mat homography1 = cv::Mat::eye(3, 3, CV_64FC1);
    cv::Mat homography2 = cv::Mat::eye(3, 3, CV_64FC1);

    double alpha1 = -13; // degrees
    double t1_x = -86; // pixel
    double t1_y = -86; // pixel

    double alpha2 = 21; // degrees
    double t2_x = 86; // pixel
    double t2_y = 86; // pixel

    // hope there is no error in the signs:
    // combine homography1
    homography1.at<double>(0, 0) = cos(CV_PI*alpha1 / 180);
    homography1.at<double>(0, 1) = -sin(CV_PI*alpha1 / 180);
    homography1.at<double>(1, 0) = sin(CV_PI*alpha1 / 180);
    homography1.at<double>(1, 1) = cos(CV_PI*alpha1 / 180);
    homography1.at<double>(0, 2) = t1_x;
    homography1.at<double>(1, 2) = t1_y;

    // compose homography2
    homography2.at<double>(0, 0) = cos(CV_PI*alpha2 / 180);
    homography2.at<double>(0, 1) = -sin(CV_PI*alpha2 / 180);
    homography2.at<double>(1, 0) = sin(CV_PI*alpha2 / 180);
    homography2.at<double>(1, 1) = cos(CV_PI*alpha2 / 180);
    homography2.at<double>(0, 2) = t2_x;
    homography2.at<double>(1, 2) = t2_y;

    cv::Mat affine1 = homography1(cv::Rect(0, 0, 3, 2));
    cv::Mat affine2 = homography2(cv::Rect(0, 0, 3, 2));

    cv::Mat dst1;
    cv::Mat dst2;

    cv::warpAffine(input, dst1, affine1, input.size());
    cv::warpAffine(input, dst2, affine2, input.size());


    cv::Mat combined_homog = homography1*homography2;
    cv::Mat combined_affine = combined_homog(cv::Rect(0, 0, 3, 2));

    cv::Mat dst_combined;

    cv::warpAffine(input, dst_combined, combined_affine, input.size());

    cv::imshow("input", input);
    cv::imshow("dst1", dst1);
    cv::imshow("dst2", dst2);

    cv::imshow("combined", dst_combined);

    cv::waitKey(0);
    return 0;
}

在此示例中,图像首先旋转并平移到左侧,然后再平移到右侧.如果两个变换依次执行,重要的图像区域将丢失.相反,如果将它们通过同形乘法组合起来,就像在一个步骤中完成了完整的操作,而不会在中间步骤中丢失图像部分.

In this example, an image is first rotated and translated to the left, later to the right. If the two transformations are performed after each other, significant image areas would get lost. Instead if they are combined by homograhy multiplication, it is like the full operation done in a single step without losing image parts in the intemediate step.

输入:

如果图像首先用 H1 转换,然后用 H2 转换:

if image was first transformed with H1, later with H2:

如果图像直接用H1*H2的组合进行变换:

if the image is transformed with the combination of H1*H2 directly:

这种单应组合的一个典型应用是首先将图像中心平移到原点,然后旋转,然后平移回原始位置.这产生的效果就像图像围绕其重心旋转一样.

One typical application of this homography combination is to first translate the image center to the origin, then rotate, then translate back to original position. This has the effect as if the image was rotated around its center of gravity.

这篇关于在 opencv 中结合旋转和平移,一次通过的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆