执行图像减法时退出代码139

时间:2014-05-16 20:28:38

标签: python numpy

我正在使用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)

当我执行帧处理为1000的代码时,我得到以下输出:

Process finished with exit code 139

你能帮助我如何克服这个错误,并在我遇到这种错误时抛出一些亮点

2 个答案:

答案 0 :(得分:4)

你可能内存不足:你有1000张图片x 360像素x 640像素x 3幅x 8位=约691 MB ......

代码139被列为here“尝试访问不在您的地址空间中的虚拟地址”,这将支持内存分配错误,如果您使用的是32位系统,这可能很容易发生内存量很少,其他内容已经在内存中了。

您可以重构代码,这样就不必在内存中保存图像列表,例如,只保留内存中的最后一个图像,然后执行减法并用当前图像覆盖它。

你可以用以下函数替换你的函数来测试:

a = []
for i in range(1000):
    a.append(numpy.ones((360,640,3), dtype=numpy.int))

并查看是否在没有内存不足的情况下运行。

答案 1 :(得分:0)

我在opencv-python == 3.1.0中遇到了类似的问题。我有:

以退出代码139(被信号11:SIGSEGV中断)结束的过程

多次成功调用cv2.seamlessClone之后突然出错。

对我来说,解决方案是升级到opencv-python == 3.4.10.37