2015-05-06 4 views
0

Я хочу отобразить изображение в PyGi, изображение сначала прочитано opencv. Но это терпит неудачу.Opencv & PyGi: как отобразить изображение, прочитанное opencv

from gi.repository import Gtk, GdkPixbuf 
import cv2 
import numpy as np 
window = Gtk.Window() 
image = Gtk.Image() 
image.show() 
window.add(image) 
window.show_all() 
im = cv2.imread("file.bmp") 
a = np.ndarray.tostring(img) 
h, w, d = img.shape 
p = GdkPixbuf.Pixbuf.new_from_data(a,GdkPixbuf.Colorspace.RGB, False, 8, w, h, w*3, None, None) 
image.set_from_pixbuf(p) 
Gtk.main() 

Но в результате получается черное изображение. Кроме того, если я петля вокруг набора файлов (несколько .bmp файлов из каталога), я получил CoreDump (подозревающих GdkPixbuf.Pixbuf.new_from_data)

Является ли это правильный способ иметь OpenCV & PyGi взаимодействия? Мне удалось использовать opencv с Tkinter, но я не могу использовать его с PyGi.

+0

вам нужно CV2 что-нибудь еще делать? В противном случае было бы намного проще использовать 'GdkPixbuf.Pixbuf.new_from_file (filename)'. – elya5

+0

Да, мне нужен cv2 - приведенный выше код является лишь уменьшением проблемы. Целевое приложение получит изображения с камеры, а не из файла. –

ответ

0

Вы можете попробовать использовать GdkPixbuf.PixbufLoader:

loader = GdkPixbuf.PixbufLoader() 
loader.write(img) 
loader.close() 
pixbuf = loader.get_pixbuf() 
image = Gtk.Image.new_from_pixbuf(pixbuf) 
+0

Это не работает, вот эта ошибка: Traceback (последний последний звонок): Файл «./simple.py», строка 14, в loader.write (im) Файл «/ usr/lib/python2 .7/dist-packages/gi/types.py ", строка 43, в функции return info.invoke (* args, ** kwargs) TypeError: Item 0: только массивы length-1 могут быть преобразованы в сканеры Python (simple.py:13225): GdkPixbuf-WARNING **: GdkPixbufLoader завершен без вызова gdk_pixbuf_loader_close() - это недопустимо. Вы должны явно закрыть поток данных загрузчику, прежде чем отбрасывать последнюю ссылку. –

+0

Кстати, любая ссылка на документацию о PixbufLoader (версия python)? –

+0

Документация PixbufLoader [здесь] (https://lazka.github.io/pgi-docs/#GdkPixbuf-2.0/classes/PixbufLoader.html#GdkPixbuf.PixbufLoader). Я не могу проверить вашу программу (или мое предложение), поскольку у меня нет opencv для Python3. Вам нужно получить байты 'img'. Возможно, это можно сделать с помощью метода 'im.data [0:]' или 'tobytes'. – elya5

0

Это на самом деле работает очень хорошо для меня. Возможно, в вашем случае была проблема с двумя разными переменными: «im» (в котором вы читаете изображение CV) и «img» (тот, который вы конвертируете в строку)?

Вот упрощенный код, который работал для меня в отображении кадра видео с камеры:

# OpenCV image: 
cap = cv2.VideoCapture(0) 
ret, img = cap.read() 
# Gtk Image: 
img_gtk = Gtk.Image() 
# Do other things such as attaching the 'img_gtk' to a window/grid... 

# Convert and display: 
h, w, d = img.shape 
pixbuf = GdkPixbuf.Pixbuf.new_from_data (img.tostring(), GdkPixbuf.Colorspace.RGB, False, 8, w, h, w*3, None, None) 
img_gtk.set_from_pixbuf (pixbuf) 
img_gtk.show() 
+0

.... Я должен раскопать свой код, но ваш ответ выглядит чертовски правильным! –

Смежные вопросы