我正在嘗試創建一個Gtk Widget,您可以將OpenCV
圖像傳遞給它,然後顯示它。我創建了一個從Gtk.Image
繼承的類,用於顯示圖像。您使用show_frame
方法將OpenCV圖像傳遞給此類,然後更新Gtk.Image
以顯示該圖像。當在Gtk Widget中顯示OpenCV圖像時發生內存泄露
我已經測試過它,它工作正常,即在調用show_frame
方法時圖像正確顯示和更新。但是,每次圖像更新時,使用的內存都會增加,直到內存不足並且程序崩潰。
我相信這是由於圖像未被正確釋放的內存。然而,我不能解決這個問題。一旦收到新的幀,我已嘗試不參考gbytes
,但這沒有幫助。只有在調用set_from_pixbuf
函數時纔會建立內存。如果這被註釋掉,則內存使用保持在恆定的水平。
class OpenCVImageViewer(Gtk.Image):
def __init__(self):
Gtk.Image.__init__(self)
def show_frame(self, frame):
# Convert to opencv BGR to Gtk RGB
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Get details about frame in order to set up pixbuffer
height = rgb_image.shape[0]
width = rgb_image.shape[1]
nChannels = rgb_image.shape[2]
gbytes = GLib.Bytes.new(rgb_image.tostring())
pixbuf = GdkPixbuf.Pixbuf.new_from_bytes(gbytes, GdkPixbuf.Colorspace.RGB, False,
8, width, height, width*nChannels)
# Add Gtk to main thread loop for thread safety
GLib.idle_add(self.set_from_pixbuf, pixbuf)
GLib.idle_add(self.queue_draw)
你有沒有嘗試unf'pixbuf'? (免責聲明:不確定它是否能正常工作。) – ace
@ace嘗試使用pixbuf.unref()來取消映射'pixbuf'引發'RuntimeError:此方法當前不受支持。 – mpursuit
在這裏有同樣的,你找到一個解決方案? – Bigfoot