实验原理
- SIFT算法:提取不容易受光照尺度等因素影响的关键点,并确定特征方向。通过关键点的特征向量,对关键点进行比较找出相互匹配的特征点,建立图像上物体的对应关系。
- 暴力匹配器:在第一幅图像选取一个特征点,然后依次与第二个图像中的特征点进行距离测试,最后返回距离最近的特征点。
实验过程
首先用detectAndCompute ()求出图像的关键点和描述符
创建暴力匹配器
用Matcher.knnMatch()获得两幅图像的K个最佳匹配,此时K=2
当匹配中的每一组匹配对距离比值小于0.75时,将该匹配对加入数组matches中。
当matches中元素超过四个时,生成视角变换矩阵,否则返回none
将两张图片的关键点进行可视化连接
将img1进行视角变换,并把img2插入到result图片最左端。
附完整代码
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 14 15:14:13 2020
@author: 张若昀的对象
"""
import cv2
import numpy as np
## 输入拼接的图片
image1 = cv2.imread("left_01.png")
image2 = cv2.imread("right_01.png")
def stitch( images, ratio = 0.75, reprojThresh = 4.0, showMatches = False):
#获取输入图片
(image2, image1) = images
#检测image1,image2图片的SIFT关键特征点,并计算特征描述子
(keypoint1, features1) = detectAndDescribe(image1)
(keypoint2, features2) = detectAndDescribe(image2)
#匹配两张图片的所有特征点,并返回匹配结果
M = matchKeypoints(keypoint1, keypoint2, features1, features2, ratio, reprojThresh)
#如果返回的结果为空,就是没有匹配成功的点,退出算法
if M is None:
return None
#当结果不为空时,提取匹配结果
#H是3*3的视觉变换矩阵
(matches