1、实验任务
-
根据归一化八点法求取基本矩阵
-
根据四点法求取单应矩阵
2、数据集
以 images 文件夹里的 DSC_0480.JPG 和 DSC_0481.JPG 两幅图片为例,这两张图像是用透视摄影机拍摄的不同视角下的两张视点图像。
3、实验代码解析
首先导入软件包。
#numoy是用于处理数组、矩阵等数据格式的库
import numpy as np
#Opencv是用来处理图像处理和计算机视觉任务的库
import cv2
#random是用于生成随机数的库
import random
#os是用于与计算机系统交互的库,如文件、路径操作
import os
#exifread是用于提取图像文件EXIF信息的库,EXIF信息是指图像拍摄设备和条件等信息的,如相机型号、光圈大小、拍摄时间等,用手机和数码相机拍照时都会将这些信息嵌入到图片文件的EXIF标签中,对图像处理和计算机视觉任务中后期修正、分析和处理图片有用
import exifread
sift特征点提取
#定义了一个名为FeatureProcess的类,用于提取sift特征点
class FeatureProcess:
#构造函数__init__,用于构造类FeatureProcess,其接受的参数image是一个numpy数组,代表着一张RGB图像
def __init__(self, image):
#为类FeatureProcess的实例对象创造一系列的属性
#第一个属性image是用来存储原始RGB图像的numpy数组的
self.image = image
#第二个属性gray是用来存储原始RGB图像的灰度图的numpy数组的,其中利用cv2.cvtColor将原始图像转为灰度图
self.gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
#第三个属性keypoints用于存储提取的sift特征点
self.keypoints = None
#第四个属性descriptors用于存储提取的sift特征点的描述符,所谓的描述符就是sift特征点的数量化描述的向量或者是矩阵
self.descriptors = None
#定义了类FeatureProcess中名为extract_features的方法,该方法用于提取sift特征点
def extract_features(self):
#利用cv2.SIFT_create()创建一个sift特征点对象
sift = cv2.SIFT_create()
#调用sift对象的detectAndCompute方法提取灰度图中的sift特征点以及描述符
keypoints, descriptors = sift.detectAndCompute(self.gray, None)
#如果特征点的个数小于20,则返回空,否则返回提取的特征点,以及它的描述符
if len(keypoints) <= 20:
return None, None
else:
self.keypoints = keypoints
self.descriptors = descriptors
return keypoints, descriptors
图像文件EXIF信息提取,主要用于计算相机的内参矩阵
#定义了一个名为PhotoExifInfo的类,用于提取图像文件EXIF信息
class PhotoExifInfo:
#类PhotoExifInfo的构造函数,接受的参数photo_path是指定图片文件的路径
def __init__(self, photo_path):
#定义了类PhotoExifInfo实例对象的一系列属性
#第一个属性是photo_path,用于存储指定图像文件的路径
self.photo_path = photo_path
#第二个属性是focal_length,用于存储指定相机的焦距
self.focal_length = None
#第三个属性是image_width,用于存储图像文件的宽度
self.image_width = None
#第四个属性是image_length,用于存储图像文件的长度
self.image_length = None
#第五个属性是sensor_pixel_size,用于存储传感器像素的大小
self.sensor_pixel_size = None
#定义类PhotoExifInfo的实例对象的方法 get_tags,用于获取指定图像文件的EXIF信息
def get_tags(self):
#获取指定路径下的图像文件,存于image_content中
image_content = open(self.photo_path, 'rb')
#利用exifread.process_file从image_content中提取图像的EXIF信息
tags = exifread.process_file(image_content)