特征识别和匹配

目录

一,特征识别

二,特征匹配

三,变换求解


一,特征识别

常用的有ORB、SIFT、SURF

c++ opencv中的SURF不是免费开源的,ORB、SIFT是免费开源的。

这里以SIFT为例

vector<KeyPoint> keyPoints;
Mat descriptors;
Ptr<cv::SIFT> detector = cv::SIFT::create(); //创建一个检测器
detector->detectAndCompute(img, Mat(), keyPoints, descriptors);

每个特征点由2部分数据组成,一个是KeyPoint,里面是特征点的具体坐标,一个是描述符,里面是描述特征的向量。

特征识别的输出结果是一堆特征点,vector<KeyPoint> keyPoints里面放所有的坐标,Mat descriptors相当于矩阵,里面放所有的描述符向量。

即,vector<KeyPoint> keyPoints的长度和Mat descriptors的行数一致,按顺序对应。

如果是ORB:

vector<KeyPoint> keyPoints;
Mat descriptors;
cv::Ptr<cv::ORB> orb = cv::ORB::create();//创建一个检测器
orb->detectAndCompute(img, Mat(), keyPoints, descriptors);

二,特征匹配

参考匹配器

这里以knnMatch为例

vector<vector<DMatch>> matches;
try {
	FlannBasedMatcher().knnMatch(descriptors2, descriptors1, matches, 2);
}
catch (Exception &e) {
	cout << e.what();
}
vector<DMatch> goodMatch;
for (int i = 0; i < matches.size(); i++)goodMatch.push_back(matches[i][0]);

这样就拿到了vector<DMatch> goodMatch,长度取决于descriptors2和descriptors1中长度的较小值。

DMatch里面存着2个特征列表的id,按照id去把对应的特征点依次扣出来,即得到2个匹配好的特征列表。

三,变换求解

根据2个匹配好的特征列表,求仿射变换

vector<Point2f> target_pts, template_pts;
Mat inliers, homography;
homography = cv::findHomography(target_pts, template_pts, RANSAC, 5, inliers);

输出的inliers是一个1列的矩阵,每一行的数表示对应的2个特征是否真实匹配上。

输出的homography 是一个3*3的矩阵,表示的变换含义如下:

\begin{pmatrix} x_2\\ y_2 \\ 1 \end{pmatrix}=\begin{pmatrix} a & b &c \\ d & e &f \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ 1 \end{pmatrix}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值