计算特征点通过单应矩阵后的坐标的小函数

来源:互联网 发布:淘宝牙齿矫正器有用吗 编辑:程序博客网 时间:2024/05/21 11:01

在图像处理中,常常需要用两幅图的对应特征点来计算单应矩阵。一般会用findHomography之类的函数来找这个单应矩阵。

我一直很好奇特征点通过找到的矩阵变换后会在什么位置。所以自己写了个小函数,可以计算点通过单应矩阵后的坐标。

代码如下:


#include <opencv2/opencv.hpp>

#include <opencv2/features2d/features2d.hpp>

#include <opencv2/imgproc/imgproc_c.h>

#include <opencv2/nonfree/nonfree.hpp>

#include <stdio.h>

#include <stdlib.h>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

using namespace cv;

using namespace std;


int getpoint(vector< Point2f > a_in,vector< Point2f >*a_out,Mat H)

{

    Mat Ma;

    Mat Mb;

    

    

    Ma.create(3,1,CV_64F);

    Mb.create(3,1,CV_64F);

   for(int i=0;i<a_in.size();i++)

    {

        Ma.at<double>(0,0)=a_in[i].x;

        Ma.at<double>(1,0)=a_in[i].y;

        Ma.at<double>(2,0)=1;

        Mb=H*Ma;

        Point2f f=Point2f(Mb.at<double>(0,0),Mb.at<double>(1,0));

        a_out->push_back(f);

        

        // cout<<Mb;

    }

    

   return 0;

}

int main()

{

    vector<Point2f> a,b;

    a.push_back(Point2f(1,2));

    a.push_back(Point2f(2,3));

    a.push_back(Point2f(3,4));

    Mat H=(Mat_<double>(3,3)<<1,2,3,4,5,6,7,8,9);

    getpoint(a, &b, H);

    cout<<b;

    

   return 0;

}


需要注意的是,两个相乘的矩阵必须满足矩阵乘法的条件。还有数据类型必须一致,在本代码中也就是H矩阵必须是double类型的。

0 0