在此代码中,我想将所有轮廓保存在一个.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.
这种转换可能吗?
答案 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不支持。您可以使用其他值填充较短的值,然后保存它们。
>>> 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
。