GTK — Python получает разницу между изображениями Pixbuf

Мне нужно получить разницу между двумя изображениями GTK 3 pixbuf. Скриншот сделан для того, чтобы получить изображения. get_byte_length дает одно и то же значение для разных изображений. Как я мог получить разницу?

Вот код:

    window = Gdk.get_default_root_window()
    x, y, width, height = window.get_geometry()

    pb = Gdk.pixbuf_get_from_window(window, x, y, width, height)
    length1 = pb.get_byte_length()


Python 3.8, GTK 3.

person pythonlearner9001    schedule 29.03.2021    source источник


Ответы (4)


Я не являюсь продвинутым программистом на Gtk или Python, но, насколько мне известно, чистый Python и GTK3 не имеют прямых возможностей для захвата FPS. Вы можете использовать некоторые способы для достижения этого, но поиск различий между изображениями путем анализа изображений может быть сложным с точки зрения использования ЦП из-за процесса, который иногда приходится повторять около 60 или более раз в секунду. Вы можете попробовать получить размер изображений и сравнить их, но, возможно, загрузка ЦП может быть высокой для счетчика FPS (я не уверен в этом). Также вам нужно найти способ сравнить размеры изображений, не сохраняя их на диске, как вы задали в своем вопросе. Операции сохранения на диске также потребляют ресурсы ЦП, если повторяются очень часто в секунду.

Обновление: это topic может дать некоторую информацию о получении размера памяти объекта python.

person codecode1985    schedule 07.04.2021

Существует разница в производительности при рендеринге Pixbuf путем получения контекста Cairo через gtk.gdk.CairoContext и при преобразовании Pixbuf в Cairo. Используйте этот код:

cr.set_source(imgSurface)

cr.rectangle(0, 0, imgSurface.get_width(), imgSurface.get_height())

cr.fill()

Думаю, это также включает

.set_source_pixbuf() и .get_source().get_surface().

person Hardyk Mahendru    schedule 31.03.2021
comment
Это может увеличить производительность, спасибо. Но как я могу получить разницу между двумя изображениями с точки зрения байтов и т. д.? Мне нужно получить изменения экрана. Я неоднократно получаю скриншоты, чтобы сделать это. Мне не нужно показывать изображения в графическом интерфейсе. - person pythonlearner9001; 31.03.2021
comment
если скриншоты похожи, байты будут одинаковыми большую часть времени. Вы хотите обнаружить изменения на них? - person Ulises; 31.03.2021
comment
@ Улисес Мартинес Элиас, меня не интересуют визуальные различия между изображениями. Я хочу обнаруживать изменения экрана, чтобы измерить частоту кадров. Интересно, что байты двух изображений одинаковы, даже если визуальные эффекты на экране сильно меняются. У вас есть другая идея получить частоту кадров, используя только GTK и python (без каких-либо внешних зависимостей)? - person pythonlearner9001; 01.04.2021
comment
Вы имеете в виду фпс? получить количество скриншотов, снятых в секунду, но я не уверен, что это надежное измерение - person Ulises; 01.04.2021
comment
@Ulises Мартинес Элиас, что вы предлагаете сделать, используя python или gtk без использования внешних зависимостей ?? - person pythonlearner9001; 01.04.2021
comment
вы можете использовать библиотеку glib из репозитория gi. документы: lazka.github.io/pgi-docs/# GLib-2.0/classes/Timer.html - person Ulises; 02.04.2021

Общая идея заключается в том, что

Вариант 1. Загрузите оба изображения в виде массивов (scipy.misc.imread) и вычислите поэлементную (попиксельную) разницу. Вычислите норму разности.

Вариант 2: Загрузите оба изображения. Рассчитайте некоторый вектор признаков для каждого из них (например, гистограмму). Рассчитывайте расстояние между векторами признаков, а не изображениями.

person Hardyk Mahendru    schedule 01.04.2021

Вы можете использовать функцию glib get_real_time() для измерения процессов в секунду.

get_real_time() дает результат в микросекундах (1 миллион в секунду)

import gi
from gi.repository import GLib

count = 0
time = GLib.get_real_time()

limit = time + 1000000

while GLib.get_real_time() < limit :
    #take screenshots here
    count += 1

print (count)

Эта функция будет подсчитывать, сколько раз процессор может захватить экран за одну секунду.

person Ulises    schedule 02.04.2021