在我的项目的一部分中,我需要在仿射变换图像中计算补丁的方向。现在我的问题是我不知道如何找到原始未扭曲图像的计算方向。
例如,找到扭曲图像中的点(100,200)。我可以使用8x8相邻像素提取此点的方向。假设它是30度。点所发现的翘曲图像是对每个轴上60度的原始图像进行变换的结果(俯仰,偏航和滚动)。(这种方向提取通常称为计算机视觉中的描述符提取)
现在已知转换矩阵。也已知变换图像中的点的方向。点wrt参考的位置是已知的(使用逆变换)。现在我想知道如果这一点(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个旋转矢量创建旋转Mat A和B.将这两个相乘后,我想将其转换为旋转矢量。但我唯一得到的是最后一行的运行时错误(cv :: Rodrigues(R_combined,rvec_result);)
提前感谢您的帮助。
答案 0 :(得分:1)
好吧,听起来你有两个旋转矩阵(你可以使用rodrigues来获取它们)称它们为A和B.你想知道如何组合它们。让我们说A代表你的箭头到补丁的方向,B代表原点的补丁。让我们从补丁中心的起源开始。 A描述了箭头的方向。现在我们想要通过B旋转原点,以便我们的原始参考轴现在在B wrt到新原点。要做到这一点,只需做
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]