应用 OpenCV 进行 增强相关系数(ECC)最大化的图像配准

本文介绍了如何利用OpenCV中的Enhanced Correlation Coefficient (ECC) 进行图像对齐,适用于解决图像配准问题。首先提到了基于ORB特征点的自动化图像透视变换方法,接着回顾了图像对齐的历史。然后详细阐述了ECC的优点,并提供了在OpenCV中使用findTransformECC()函数进行图像对齐的示例。最后,提供了相关素材和代码的下载链接。
摘要由CSDN通过智能技术生成

目录

1.基于ORB自动化图像透视变换方法

2.图像对齐的历史知识

3.应用ECC进行图像对齐

4.参考资料


想说的话:

研究该专题是因为在后续使用随机森林做样本训练的过程中我需要提前制作样本的数据集,但是这就面临一个问题:图像的对齐问题 为了解决图像的对齐问题,我查到了一篇论文: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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值