我正在使用python执行图像减法.我有numpy数组形式的图像.携带所有图像的列表的大小是1000.列表中的每个numpy数组是360*640类型.当帧数约为300时,帧减法正确发生.
def find_der(frames):
der = []
for a in range(len(frames)-1):
der.append(frames[a + 1] - frames[a])
return der
framesprocessing = 1000
for j in range(framesprocessing):
img = cv.QueryFrame(video)
if img is None:
print("Images are Not Captured")
else:
tmp = cv.CreateImage(cv.GetSize(img), 8, 3)
saveImagesColor = 'Abhiram_images/RGB/frame' + str(i) + '.png' #Saving the iplimages to the local PC
cv.SaveImage(saveImagesColor, img)
saveImagesGray = 'Abhiram_images/GRAY/frame' + str(i) + '.png' #Saving the grayscale images to the local PC
img1 = cv2.imread(saveImagesColor)
grayimg = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
cv2.imwrite(saveImagesGray, grayimg)
graynumpyimage = np.array(grayimg, dtype='int64')
grayscale.append(graynumpyimage)
i += 1
first_der = find_der(grayscale)
Run Code Online (Sandbox Code Playgroud)
当我执行帧处理为1000的代码时,我得到以下输出:
Process finished with exit code 139
Run Code Online (Sandbox Code Playgroud)
你能帮助我如何克服这个错误,并在我遇到这样的错误时抛出一些亮光
您可能内存不足:您有1000张图片x 360像素x 640像素x 3条带x 8位=大约691 MB ...
代码139 在此处列为“试图访问不在您的地址空间中的虚拟地址”,这将支持内存分配错误,如果您使用的RAM数量较少的32位系统,则很容易发生这种情况。事情已经在记忆中了。
您可以重构代码,这样就不必在内存中保存图像列表,例如,仅将最后一个图像保存在内存中,然后执行减法并用当前图像覆盖它。
您可以通过以下方式测试您的功能:
a = []
for i in range(1000):
a.append(numpy.ones((360,640,3), dtype=numpy.int))
Run Code Online (Sandbox Code Playgroud)
并查看它是否在不耗尽内存的情况下运行。
| 归档时间: |
|
| 查看次数: |
18505 次 |
| 最近记录: |