目录
想说的话:
研究该专题是因为在后续使用随机森林做样本训练的过程中我需要提前制作样本的数据集,但是这就面临一个问题:图像的对齐问题 为了解决图像的对齐问题,我查到了一篇论文:Parametric Image Alignment Using Enhanced Correlation Coefficient Maximization 但是发现ECC算法已经被实现了,所以整理下如何应用。
在整理的过程中发现了一名大佬,我的内容是从他的github:https://github.com/spmallick/learnopencv整理而来。
简历:
有兴趣的小伙伴可以关注!!!
1.基于ORB自动化图像透视变换方法
在之前识别答题卡的博客中,为了提取答题卡的区域特征我应用了OTSU方法;为了进行计算透视变化的矩阵我应用了DP算法来计算矩形的四个对应的点,但是今天却看到了更有价值的方法,在此进行分析:
问题:寻找一种鲁棒的算法让左右两幅图像进行对齐。
思路:
计算图像的ORB特征点(当然也可以选择其他特征点,但是计算量会更大)-->筛选最佳的匹配点-->基于这些匹配点应用Levenberg–Marquardt方法迭代求解非线性方程组(在OpenCV中已经实现了)-->计算单应性矩阵-->图像变换
代码实现(注意:要实现这段代码需要对opencv的xfeatures2d自行编译):
#include<iostream>
#include<opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/features2d.hpp"
using namespace cv;
using namespace std;
using namespace xfeatures2d;
void alignImages1(Mat img1, Mat img2, Mat &result, Mat &M)
{
//rgb-gray转化
cvtColor(img1,img1,CV_BGR2GRAY);
cvtColor(img2, img2, CV_BGR2GRAY);
//计算orb
Ptr<Feature2D> orb = ORB::create();
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
orb->detectAndCompute(img1, Mat(), keypoints1, descriptors1);
orb->detectAndCompute(img2, Mat(), keypoints2, descriptors2);
//匹配
vector<DMatch> matches;
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
matcher->match(descriptors1, descriptors2, matches, Mat());
//筛选好的匹配
sort(matches.begin(), matches.end());
const int numGoodMatches = matches.size() * 0.15;
matches.erase(matches.begin() + numGoodMatches, matches.end());
//绘图确认下匹配关系
Mat drawMat;
drawMatches(img1, keypoints1, img2, keypoints2, matches, drawMat);
//提取好的匹配点
vector<Point2f> points1, points2;
for (size_t i = 0; i < matches.size(); i++)
{
points1.push_back(keypoints1[matches[i].queryIdx].pt);
points2.push_back(keypoints2[matches[i].trainIdx].pt);
}
//随机取样一致性计算单应性矩阵
M = findHomography(points2, points1, RANSAC);
//进行单应性变换
warpPerspective(img2, result, M, img1.size());
}
int main()
{
Mat templateImg = imread("form.jpg");
Mat testImg = imread("scanned-form.jpg");
//存储对齐结果
Mat