简体   繁体   English

如何使用C库刷新Python程序中的内存?

[英]How do i flush memory in a Python program with C-library?

The Python-programs function is to find the brightest light with a webcam and send X,Y-coordinates to a arduino program. Python程序功能是使用网络摄像头查找最亮的光线,并将X,Y坐标发送到arduino程序。 This is to follow the sun with a camera. 这是用相机跟随太阳。

The the problem is that the memory increases until the program freezes. 问题是内存增加,直到程序冻结。 I've tried to deleve all the variables after use. 我试过使用后去掉所有变量。 But it's still using too much memory. 但是它仍然使用过多的内存。

os: Windows 7 操作系统:Windows 7

How can I find the leak, and stop it? 我如何找到并阻止泄漏?

Here's the python code: 这是python代码:

import cv
import traceback
import serial



try:
    cv.NamedWindow("CameraFeed", 1)
    capture = cv.CaptureFromCAM(0)
    cv.NamedWindow("Altered", 1)


except:
    cv.DestroyWindow("CameraFeed")
    cv.DestroyWindow("Altered")
    traceback.print_exc()

ser = serial.Serial("COM15",9600)



def repeat():
    imga = cv.QueryFrame(capture)
    img = cv.CreateImage(cv.GetSize(imga),8,3)
    cv.Smooth(imga, img, cv.CV_BLUR, 3)     


    thresholded_img =  cv.CreateImage(cv.GetSize(img), 8, 1)
    del(img)


    minv = cv.Scalar(250,250,250, 0)
    maxv = cv.Scalar(255,255,255, 0)
    cv.InRangeS(imga, minv, maxv, thresholded_img) 
    del(minv)
    del(maxv)        
            #determine the objects  moments and check that the area is large  
            #enough to be our object
    moments = cv.Moments(cv.GetMat(thresholded_img,1), 0) 
    area = cv.GetCentralMoment(moments, 0, 0)

            #there can be noise in the video so ignore objects with small areas 


    if(area > 10000):

                #determine the x and y coordinates of the center of the object 
                #we are tracking by dividing the 1, 0 and 0, 1 moments by the area 
            x = cv.GetSpatialMoment(moments, 1, 0)/area 
            y = cv.GetSpatialMoment(moments, 0, 1)/area 
            del(moments)
            del(area)
                #print 'x: ' + str(x) + ' y: ' + str(y) + ' area: ' + str(area) 

                #create an overlay to mark the center of the tracked object 
            overlay = cv.CreateImage(cv.GetSize(imga), 8, 3) 

            cv.Circle(imga, (int(x), int(y)), 5, (255, 0, 0), 20) 
            cv.Add(imga, overlay, imga)
            del(overlay)
                #add the thresholded image back to the img so we can see what was  
                #left after it was applied 
            cv.Merge(thresholded_img, None, None, None, imga)

            print 'X: ',x
            print 'Y: ',y
            print ' '
            if x < 300:
                print "left"    
            if x > 340:
                print "Right"
            if y < 210:
                print "Up"
            if y > 250:
                print "Down"

            ser.write('%03i%03i\r\n'% (int(x),int(y))) 







    else:
            ser.write('%03i%03i\r\n'% (320,240)) 



    cv.ShowImage("CameraFeed", thresholded_img)
    cv.ShowImage("Altered", imga)
    del(imga)
    del(thresholded_img)


try:
    while True:
        repeat()
        if cv.WaitKey(10) == 13:
            break
except:
    cv.DestroyWindow("CameraFeed")
    cv.DestroyWindow("Altered")
    ser.close()
    traceback.print_exc()

cv.DestroyWindow("CameraFeed")
cv.DestroyWindow("Altered")
ser.close()
del(serial)
exit()

这是GetMat的已知错误-> http://code.opencv.org/issues/1579

The code looks correct ( example how to do it ). 该代码看起来正确( 示例如何执行 )。 It's not necessary to delete the variables; 不必删除变量; they will all be deleted when repeat() returns. repeat()返回时,它们都将被删除。

My guess is that there is a bug in the version of OpenCV that you're using. 我的猜测是您使用的OpenCV版本中存在一个错误。 Try a different version. 尝试其他版本。 Consider to report the bug if the behavior happens in the latest version but not in an older one. 如果该行为发生在最新版本中而不是较旧版本中,请考虑报告该错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM