正如標題所示,我正在從我的攝像頭讀取幀(使用openCV,我想跟隨它進行一些跟蹤功能檢測),並且想要將結果寫入pyGTK3 DrawableArea小部件。繼this答案,我將引用爲了方便:從網絡攝像頭畫框到pygtk3的DrawableArea時的分段錯誤
下,似乎做的工作:
def draw(self, widget, context):
Gdk.cairo_set_source_pixbuf(context, self.pixbuf, 0, 0)
context.paint()
一個問題仍然存在:這是做事的最佳方式是什麼?
所以我現在使用:
def _on_drawablearea_draw(self, canvas, context):
frame = self.stream.read()
self.pixbuf = self._frame2pixbuf(frame)
Gdk.cairo_set_source_pixbuf(context, self.pixbuf, 0, 0)
context.paint()
def _frame2pixbuf(self, frame):
height, width, rgb_stride = frame.shape
frame_to_list = frame.flatten() # must become list
return GdkPixbuf.Pixbuf.new_from_data(frame_to_list,
GdkPixbuf.Colorspace.RGB,
False, 8,
width, height, rgb_stride * width)
frame
是形狀(m,n,3)
的numpy的陣列。
不幸的是,我在發言得到了segmentation fault
:
Gdk.cairo_set_source_pixbuf(context, self.pixbuf, 0, 0)
這apparantly發生如被看見在評論上述引用的答案,提供的卻沒有解決方案和快速谷歌搜索產生了更多的成員沒有結果。
更新1:從文件加載PIXBUF按預期方式工作,即
def _image2pixbuf(self):
filename = 'some_test_image.jpg'
return GdkPixbuf.Pixbuf.new_from_file(filename)
與除了改變._image2pixbuf
同一呼叫到_on_drawablearea_draw
在DrawableArea插件呈現some_test_image.jpg
完美。
更新2:轉換爲字節,創建從字節PIXBUF中爲我的作品,即
def _frame2pixbuf(self, frame):
height, width, rgb_stride = frame.shape
frame_in_bytes = GLib.Bytes.new(frame.tobytes())
return GdkPixbuf.Pixbuf.new_from_bytes(frame_in_bytes,
GdkPixbuf.Colorspace.RGB,
False, 8,
width, height, rgb_stride * width)
,但它增加了一個「不必要」額外的幀數據轉換成字節的步驟(?)。
問題:
如何解決在
GdkPixbuf.Pixbuf.new_from_data
的情況下,該段錯誤?現在看來,這個功能的論點被嚴重挑選出來了。此外,正如上面引用的答案還問:這是從網絡攝像頭寫一個框架到DrawableArea小部件的首選方式?