如何将轮廓列表转换为numpy数组?

时间:2017-05-30 09:43:11

标签: python arrays opencv numpy

在此代码中,我想将所有轮廓保存在一个.h5文件中。但这只有在我将轮廓转换为numpy数组时才有可能。

import numpy as np
import h5py
import cv2

thresh,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = False)[40:50]
l = len(contours)
cnts = []

for i,contour in enumerate(contours):
    contour = np.array(contour,dtype = np.int32)
    cnts.append(contour)

cnts = np.array(cnts).astype('int32')
directory = 'Hist_defects'
os.makedirs(directory,exist_ok = True)
h = h5py.File('Hist_defects/'+str(k)+'.h5') 
h.create_dataset('dataset_1',data=cnts)
h.close()

运行时出现以下错误。

cnts = np.array(cnts).astype('int32')
ValueError: setting an array element with a sequence.

这种转换可能吗?

1 个答案:

答案 0 :(得分:1)

当您contours中的元素长度相等时,会发生错误:

>>> import numpy as np

>>> contours = [[1, 2, 3], [1, 2]]  # not equal lengths
>>> cnts = []

>>> for contour in contours:
...     cnts.append(np.array(contour, dtype=np.int32))

>>> cnts = np.array(cnts).astype('int32')
ValueError: setting an array element with a sequence.

那是因为NumPy不支持enter image description here。您可以使用其他值填充较短的值,然后保存它们。

>>> contours = [[1, 2, 3], [1, 2]]

>>> maxlength = max(map(len, contours))

>>> cnts = []
>>> for contour in contours:
...     contour_arr = np.zeros(maxlength, dtype=np.int32)
...     contour_arr[:len(contour)] = contour
...     cnts.append(contour_arr)

>>> np.array(cnts)
array([[1, 2, 3],
       [1, 2, 0]])

您可以使用"ragged arrays"来选择另一个"缺失值"而不是np.zeros

如果contours是多维的,那就有点复杂了。但在这种情况下,您也可以使用np.full