0

在我的项目的一部分中,我需要计算仿射变换图像中补丁的方向。现在我的问题是我不知道如何找到相对于原始未变形图像的计算方向。

例如,在扭曲的图像中找到一个点(100,200)。我可以使用 8x8 相邻像素提取该点的方向。假设它是30度。找到该点的扭曲图像是对原始图像在每个轴上进行 60 度变换的结果。(俯仰、偏航和滚动)。(这种方向提取通常称为计算机视觉中的描述符提取)

现在变换矩阵是已知的。变换图像中点的方向也是已知的。参考点的位置是已知的(使用逆变换)。现在我想知道如果这个点(100,200)进入参考系(例如150,250),新的方向是什么。换句话说,关于参考图像的新方向是什么。

我知道如果我们只有滚动角旋转(60 度),这很容易解决。在这种情况下,参考系的方向将是 30+60 = 90 。

我尝试使用 OpenCV 实现它:

        cv::Mat rvec1(3,1,CV_32F); // rot vector related to B
        rvec1.at<float>(0,0)=0;
        rvec1.at<float>(1,0)=30*to_RAD;
        rvec1.at<float>(2,0)=0;

        cv::Mat rvec2(3,1,CV_32F); // rot vector related to A
        rvec2.at<float>(0,0)=0;
        rvec2.at<float>(1,0)=60*to_RAD;
        rvec2.at<float>(2,0)=0;

        cv::Mat R_A;
        cv::Mat R_B;

        cv::Rodrigues(rvec1, R_B);
        cv::Rodrigues(rvec2, R_A);

        cv::Mat R_combined= R_B*R_A;

        cv::Mat rvec_result;
        cv::Rodrigues(R_combined,rvec_result);

我想使用 2 个旋转矢量创建旋转垫 A 和 B。在将这两个相乘后,我想将其转换为旋转向量。但我得到的唯一结果是最后一行出现运行时错误(cv::Rodrigues(R_combined,rvec_result);)

提前谢谢你的帮助。

4

1 回答 1

1

好的,听起来您有两个旋转矩阵(您可以使用罗德里格斯来获取它们),将它们称为 A 和 B。您想知道如何组合它们。假设 A 代表箭头相对于补丁的方向,B 是补丁相对于原点的方向。让我们从补丁中心的原点开始。A 描述了箭头的方向。现在我们想将原点旋转 B,以便我们的原始参考轴现在位于 B 处,相对于新原点。要做到这一点

Combined = [B]*[A];

更新

我不知道为什么你的代码会给你一个错误,它对我来说非常有效。这是我运行的代码。

cv::Mat rvec1(3,1,CV_32F); // rot vector related to B
rvec1.at<float>(0,0)=0;
rvec1.at<float>(1,0)=30*M_PI/180;;
rvec1.at<float>(2,0)=0;

cv::Mat rvec2(3,1,CV_32F); // rot vector related to A
rvec2.at<float>(0,0)=0;
rvec2.at<float>(1,0)=60*M_PI/180;;
rvec2.at<float>(2,0)=0;

cv::Mat R_A;
cv::Mat R_B;

cv::Rodrigues(rvec1, R_B);
cv::Rodrigues(rvec2, R_A);

cv::Mat R_combined= R_B*R_A;

cv::Mat rvec_result;
cv::Rodrigues(R_combined,rvec_result);

std::cout << rvec1 << std::endl<<std::endl;
std::cout << rvec2 << std::endl<<std::endl;
std::cout << R_A << std::endl<<std::endl;
std::cout << R_B << std::endl<<std::endl;
std::cout << R_combined << std::endl<<std::endl;
std::cout << rvec_result << std::endl<<std::endl;

这是我的输出

[0; 0.52359879; 0]

[0; 1.0471976; 0]

[0.49999997, 0, 0.86602545;
0, 1, 0;
-0.86602545, 0, 0.49999997]

[0.86602539, 0, 0.5;
0, 1, 0;
-0.5, 0, 0.86602539]

[-5.9604645e-08, 0, 1;
0, 1, 0;
-1, 0, -5.9604645e-08]

[0; 1.5707964; 0]
于 2012-09-05T21:27:19.107 回答