我试图通过匹配SIFT描述和发现由RANSAC变换矩阵搜索中输入图像的特定对象。 对象只能在现场由相似性来修改2D空间变换(缩放,旋转,平移),所以我需要估计的2×2的变换矩阵,而不是3×3单应性矩阵在3D空间中。 我怎样才能在OpenCV中实现这一目标?
Answer 1:
您可以使用estimateRigidTransform (我不知道是否是RANSAC,在代码http://code.opencv.org/projects/opencv/repository/revisions/2.4.4/entry/modules/video/src/lkpyramid.cpp RANSAC说,在其评论),第三个参数被设置为false
,以得到公正规模+旋转+翻译:
#include <vector>
#include <iostream>
#include "opencv2/video/tracking.hpp"
int main( int argc, char** argv )
{
std::vector<cv::Point2f> p1s,p2s;
p1s.push_back(cv::Point2f( 1, 0));
p1s.push_back(cv::Point2f( 0, 1));
p1s.push_back(cv::Point2f(-1, 0));
p1s.push_back(cv::Point2f( 0,-1));
p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1+sqrt(2)/2));
p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1+sqrt(2)/2));
p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1-sqrt(2)/2));
p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1-sqrt(2)/2));
cv::Mat t = cv::estimateRigidTransform(p1s,p2s,false);
std::cout << t << "\n";
return 0;
}
编译和OpenCV的2.4.4测试。 输出是:
[0.7071067988872528, -0.7071067988872528, 1.000000029802322;
0.7071067988872528, 0.7071067988872528, 1.000000029802322]
Answer 2:
您可以使用使用找到OpenCV的点将台之间的仿射变换,这是略多于你所描述的情况下(被称为相似变换),因为它描述的形状的剪切变换以及更普遍。
它可以使用函数来执行getAffineTransform(InputArray src, InputArray dst)
这需要2套的三点,并计算它们之间的仿射变换。
文章来源: How to estimate 2D similarity transformation (linear conformal, nonreflective similarity) in OpenCV?