Python SIFT提取特征描述子des的保存与读取

写在前面

本文参考了脸红的思春期的博客对OpenCV进行SIFT计算出的特征描述子des来进行保存的操作。非常感谢作者提供了很好的思路,在项目里帮了大忙。

引文

我们在进行SIFT运算来得到图像的特征点信息以及特征点信息时通常直接使用OpenCV相关的库函数进行计算,这非常的方便。
但是随着图片的像素增加,进行SIFT计算所需时间会变长,所以当要对大量图片进行处理来进行特征点配准时就出现了程序效率过低的现象,因为输入的是需要计算的图片。
如果图片处理是时间占用的大头,那么我们提前将需要多次比对的图片提前进行特征提取并将提取的特征描述子数据放在txt文件里面,在进行后面的FLANN计算时直接读取文件里的数据就可以大大提高程序的效率。
所以我们就需要存储和读取的相关操作了。具体操作如下。

代码实现

1.数据储存

因为后面的计算只需要特征描述子des而不需要特征点信息,而des是一个numpy数组,所以只需要将des成行保存在txt文件中。

def Data_Save(count):
    for i in range(count):
        img = cv2.imread('result/img2/' + str(i) + '.jpg', 0)  
        kp, des = pysift.computeKeypointsAndDescriptors(img)
        np.savetxt('result/txt/' + str(i) + '.txt', des, fmt='%.2f')

我所有需要进行特征点提取的图片都在’result/img2/'文件夹下按照编号命名,count是图片的总数。
在进行SIFT计算后得到相应的特征点kp和描述子des,然后将其按照编码分别保存在对应的txt文件中。
执行后会在相应的文件夹生成按序号排列的特征描述子数据txt。

2.数据读取

按理来说数据读取是很简单的部分,只需要从文件将特征重新读取为numpy数组就可以了。

des = np.loadtxt('result/txt/' + str(i) + '.txt', delimiter=' ')

非常简单就可以得到相应的数组,效率很高。
但是如果你接下来要进行FLANN运算的话,直接将读取的des作为输入
例如

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des, k=2)

在进行计算时flann会报错数据类型有误
对比后发现存储的数据本身是float32类型,但是读取后默认选择了float64类型,导致两者前后不一致。
只需要改变一下数据类型就可以完美解决了。
下面是读取部分的完整代码,各位根据自身情况修改即可。(des1已提前计算完毕des2是需要读取的数据)

for i in range(count):
    des2 = np.loadtxt('result/txt/' + str(i) + '.txt', delimiter=' ')
    des2 = np.array(des2, dtype=np.float32)
    FLANN_INDEX_KDTREE = 0
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=50)
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)

一点小小心得,如果有帮到大伙希望能给作者点个点赞收藏,谢谢诸位。

猜你喜欢

转载自blog.csdn.net/qq_45912037/article/details/127071788