2012-05-09 42 views
2

Python程序功能是通過網絡攝像頭找到最亮的光線,並將X,Y座標發送到arduino程序。這是用相機跟隨太陽。如何使用C庫在Python程序中刷新內存?

問題是內存會增加,直到程序死機。 我試過在使用後刪除所有變量。但它仍然使用太多的內存。

操作系統:Windows 7

如何找到泄漏並停止它?

這裏的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() 
+0

什麼是 「CV」? ... –

+0

cv(openCV)是一個用於實時圖像處理的C庫。我正在使用它來處理來自網絡攝像頭的圖像。 – user1384392

回答

1

的代碼看起來是正確的(example how to do it)。沒有必要刪除變量;當repeat()返回時,它們全部被刪除。

我的猜測是在您使用的OpenCV版本中存在一個錯誤。嘗試不同的版本。考慮報告錯誤,如果行爲發生在最新版本中,而不是舊版本。

+0

謝謝你的迴應!我試圖重新安裝更高版本的openCV。但這是同樣的問題。 我已經做了一些研究,似乎我需要釋放cv.QueryFrame之後的幀,否則它會泄漏。但我不知道該怎麼做。 – user1384392

+0

沒有。該文檔說「返回的圖像不應該由用戶發佈或修改」。你的問題是你用'CreateImage'創建了很多圖片,你永遠不會釋放這些圖片。創建一次圖像對象,然後重新使用它們。 –

+0

你可以用'println dir(img)'檢查圖像的方法;也許有一種免費/銷燬方法。 –

3

這是GetMat的一個已知的bug - >http://code.opencv.org/issues/1579

+0

你有任何想法如何解決這個錯誤? – user1384392

+0

他們現在似乎沒有在這個bug中工作。 現在,我想你必須自己找到並修正python包裝器代碼上的錯誤。 如果你這樣做,讓我知道,造成這個bug也令我煩惱... –

相關問題