经过大约4周的学习,实验等等,我终于有一个脚本可以满足我的需要。它根据我创建的某个投影矩阵改变图像的视角。当我为一个图像运行脚本时它工作正常,但我想在一个图中绘制六个图像。当我尝试这样做时,我收到内存错误。
所有图像的宽度均为2448像素,高度均为2048像素。我的剧本:
files = {'cam1': 'c1.jpg',
'cam2': 'c2.jpg',
'cam3': 'c3.jpg',
'cam4': 'c4.jpg',
'cam5': 'c5.jpg',
'cam6': 'c6.jpg'}
fig, ax = plt.subplots()
for camname in files:
img = Image.open(files[camname])
gray_img = np.asarray(img.convert("L"))
img = np.asarray(img)
height, width, channels = img.shape
usedP = np.array(P[camname][:,[0,1,3]])
usedPinv = np.linalg.inv(usedP)
U, V = np.meshgrid(range(gray_img.shape[1]),
range(gray_img.shape[0]))
UV = np.vstack((U.flatten(),
V.flatten())).T
ones = np.ones((UV.shape[0],1))
UV = np.hstack((UV, ones))
# create UV_warped
UV_warped = usedPinv.dot(UV.T).T
# normalize vector by dividing by the third column (which should be 1)
normalize_vector = UV_warped[:,2].T
UV_warped = UV_warped/normalize_vector[:,None]
# masks
# pixels that are above the horizon and where the V-projection is therefor positive (X in argus): make 0, 0, 1
# pixels that are to far: make 0,0,1
masks = [UV_warped[:,0]<=0, UV_warped[:,0]>2000, UV_warped[:,1]>5000, UV_warped[:,1]<-5000] # above horizon: => [0,0,1]
total_mask = masks[0] | masks[1] | masks[2] | masks[3]
UV_warped[total_mask] = np.array([[0.0, 0.0, 1.0]])
# show plot
X_warped = UV_warped[:,0].reshape((height, width))
Y_warped = UV_warped[:,1].reshape((height, width))
gray_img = gray_img[:-1, :-1]
# add colors
rgb = img[:,:-1,:].reshape((-1,3)) / 255.0 # we have 1 less faces than grid cells
rgba = np.concatenate((rgb, np.ones((rgb.shape[0],1))), axis=1)
plotimg = ax.pcolormesh(X_warped, Y_warped, img.mean(-1)[:,:], cmap='Greys')
plotimg.set_array(None)
plotimg.set_edgecolor('none')
plotimg.set_facecolor(rgba)
ax.set_aspect('equal')
plt.show()
我觉得numpy.meshgrid非常耗费内存,但我不确定。有人看到我的记忆迅速被吃掉了吗? (顺便说一句,我有一台装有12Gb RAM的笔记本电脑,只有很少一部分用于其他程序)
答案 0 :(得分:2)
您可能希望使用this library对代码进行分析。
它将显示脚本使用内存的位置。
答案 1 :(得分:2)
有关于内存分析器的Stackoverflow问题here。另外,我过去曾使用this answer中的技巧作为快速了解代码内存失控的方法。我只是在整个地方打印resource.getrusage()结果。它不干净,并不总是有效,但它是标准库的一部分,而且很容易做到。
答案 2 :(得分:1)
我通常会使用profile
和cProfile
模块进行分析,因为它可以非常轻松地测试各个代码段。