前言
本文介绍如何利用OpenCV从两幅图像中提取定位精度较高的尺度不变特征变换(SIFT)特征,并结合特征匹配方法建立两幅图像的特征对应关系。
1. 程序架构
利用MFC实现了简易的Demo程序以便交互操作,界面如下所示。首先为两幅待匹配的图像选择正确的路径,再指定拟提取的特征类型(SIFT、SURF、ORB等),以及特征匹配方法(Brute Force、Flann Based等),随后点击“显示匹配点对”,即可呈现两幅图像中经过精确匹配的SIFT特征对应关系。此外,还可点击“保存匹配结果”,将匹配得到的SIFT点对的像素坐标,以文件形式保存至指定路径。
2. 特征提取
2.1. 读取图像
(1)从MFC EditBrowse Control控件中读取图像文件的路径;
CString selectedPath1, selectedPath2;
GetDlgItemText(IDC_MFCEDITBROWSE_Image1, selectedPath1);
GetDlgItemText(IDC_MFCEDITBROWSE_Image2, selectedPath2);
(2)将CString类型的文件路径转为cv::String类型,作为imread函数的输入参数;
USES_CONVERSION;
cv::String cvStr1 = W2A(selectedPath1);
cv::String cvStr2 = W2A(selectedPath2);
Mat img1 = imread(cvStr1);
Mat img2 = imread(cvStr2);
(3)判断图像是否读取成功,并将彩色图像转为灰度图像。
if (img1.data == NULL || img2.data == NULL)
{
MessageBox(_T("Reading error"));
return;
}
if (img1.channels() > 1)
{
cvtColor(img1, img1, COLOR_BGR2GRAY