上一篇文章单应性矩阵的计算,本文主要介绍如何把单应性矩阵应用于图像拼接中。
这里用手机拍摄了一幅画,分左图和右图。
左图
右图
具体的操作步骤:
提取两幅图中的特征点和描述子,常用的有ORB、SURF和SIFT。
对描述子进行匹配,OpenCV 提供了BFMatcher 和 FLANNMatcher
对匹配的特征点,会存在错误的匹配,通过RANSAC (Random Sample Consensus)筛选出正确的匹配。
对匹配的点对,计算单应性矩阵H
对右图应用H变换,然后进行重叠区域融合
实战
提取SIFT特征点和描述子
cv::Ptr sift = xfeatures2d::SIFT::create(); sift->detectAndCompute(img1, noArray(), kpts1, desc1);
2. 特征点粗匹配
void match(const Mat& desc1, const Mat& desc2, std::vector& matches){
cv::Ptr matcher = FlannBasedMatcher::create(); std::vector<std::vector> pair_matches; matcher->knnMatch(desc1, desc2, pair_matches, 2); for (int i = 0; i < pair_matches.size(); ++i) {
if(pair_matches[i].size()<2) continue; DMatch& m0 = pair_matches[i][0]; DMatch& m1 = pair_matches[i][1]; if (m0.distance < 0.6 * m1.distance){
matches.push_back(m0); } }}
粗匹配,可以看到有一些是错误的匹配
3. 通过RANSAC筛选出正确的匹配和H矩阵 findHomography 已经包括了cv::RANSAC,mask 掩膜用来表示哪些点是goodmatch .
M H = findHomography(srcpts, dstpts,mask, cv::RANSAC, 5);