首页 > 解决方案 > 在 Python 中将矩阵列表转换为仅一个 2D 矩阵

问题描述

我有一个 3960 个矩阵的列表,它只是 3960 个图像的 SIFT 描述符。这应该会导致矩阵列表的行数未知(这当然取决于图像)和 128 列(来自 SIFT 描述符)。我试图把这个列表放在一个二维矩阵中,它的行数是这些矩阵的行数和 128 列的总和,但是,我无法做到这一点。这是我的代码:

sift_keypoints = []

#read images from a text file
with open(file_images) as f:
    images_names = f.readlines()
    images_names = [a.strip() for a in images_names]

    for line in images_names:
        print(line)
        #read image
        image = cv2.imread(line,1)
        #Convert to grayscale
        image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        #SIFT extraction
        sift = cv2.xfeatures2d.SIFT_create()
        kp, descriptors = sift.detectAndCompute(image,None)
        #appending sift keypoints to a list
        sift_keypoints.append(descriptors)

        #here is what I've tried
        sift_keypoints = np.asmatrix(np.asarray(sift_keypoints))

根据此代码, sift_keypoints 形状为 (1,3960),这当然不是我想要的。如何在 2D numpy 数组中转换此列表?

编辑一个说明我的问题的简单示例是以下代码中的示例

#how to convert this list to a matrix with shape (412,128)?
import numpy as np
x=np.zeros((256,128))
y=np.zeros((156,128))
list=[]
list.append(x)
list.append(y)

标签: pythonopencvmatrixsift

解决方案


解决方案使用np.row_stack

假设l是您的形状的 Numpy 数组列表(n, 128)

假设m是总行数:对象是将所有对象堆叠起来,创建一个形状为 的矩阵(m, 128)

我们可以使用 Numpy 进行如下操作row_stack

result = np.row_stack(l)

推荐阅读