我正在尝试通过匹配 SIFT 描述符并通过 RANSAC 查找转换矩阵来搜索输入图像中的特定对象。只能通过 2D 空间中的相似变换(缩放、旋转、平移)在场景中修改对象,因此我需要在 3D 空间中估计 2x2 变换矩阵而不是 3x3 单应矩阵。我如何在 OpenCV 中实现这一点?
最佳答案
您可以使用 estimateRigidTransform (不知道是不是RANSAC,http://code.opencv.org/projects/opencv/repository/revisions/2.4.4/entry/modules/video/src/lkpyramid.cpp处的代码在注释中说是RANSAC),第三个参数设置为false
,为了得到just scale+rotation+translation:
#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]
关于opencv - 如何在 OpenCV 中估计二维相似性变换(线性共形、非反射相似性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833049/