Как следует из названия, я читаю кадры со своей веб-камеры (используя openCV, я хочу выполнить с ней некоторое обнаружение дополнительных функций) и хочу записать результат в виджет 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)
.
К сожалению, я получаю segmentation fault
в заявлении:
Gdk.cairo_set_source_pixbuf(context, self.pixbuf, 0, 0)
Очевидно, это произошло с большим количеством участников, как видно из комментариев к приведенному выше ответу, однако решение не было предоставлено, и быстрый поиск в Google не дал результатов.
Обновление 1: загрузка pixbuf из файла работает должным образом, т.е.
def _image2pixbuf(self):
filename = 'some_test_image.jpg'
return GdkPixbuf.Pixbuf.new_from_file(filename)
с тем же вызовом _on_drawablearea_draw
, за исключением изменения на ._image2pixbuf
, отлично отображает some_test_image.jpg
в виджете DrawableArea.
Обновление 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?