• Как накладывать изображения в python?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. если переформулировать вопрос:
    Есть два изображения (A и B) с одинаковым набором маркеров. Нужно трансформировать изображение B так, чтобы его маркеры совпали по положению с маркерами изображения A, а потом наложить результат на изображение A.
    Я так понял?

    Если да, то это делается примерно так.
    1. Формируешь два массива координат - маркеры на изображениях A и B. Как - зависит от типа маркеров, но порядок должен быть одинаковым в обоих массивах. Форма (shape) массивов должна быть (N, 1, 2), где последний индекс отвечает за x или y координату, а N - число маркеров.
    2. Вызываешь
    homography, ptmask = cv2.findHomography(arrayB, arrayA, cv2.RANSAC)
    .
    homography будет матрицей проективного преобразования - как повернуть маркеры B, чтобы они легли на маркеры A. ptmask будет содержать сведения о том, какие пары точек удалось совместить.
    3. Делаешь вызов cv2.warpPerspective(), чтобы повернуть изображение B согласно матрице homography. Параметр размера должен быть таким чтобы второе изображение точно уместилось вместе с первым. Например, можно заранее создать большое изображение по размеру.
    4. Делаешь совмещение. Используешь cv2.PerspectiveTransform(), чтобы понять, где на итоговом изображении будут углы изображения B, делаешь cv2.fillPoly() чтобы создать бинарную маску для наложения. В маске белый пиксель будет означать "сюда поместить пиксель из повернутого B", а черный - "оставить пиксель как есть". Используешь эту маску, чтобы выполнить наложение.

    Пример кода и исходных данных - не совсем то, что тебе нужно, но идею передаст, я надеюсь.
    Ответ написан
  • Tkinter grid, как растянуть сетку на все окно?

    Vindicar
    @Vindicar
    RTFM!
    Адаптивность решается через rowconfigure() и columnconfigure().
    А вот сам вопрос кривой: тебе нужно окно на весь экран, или только виджет на всё окно? Это разные вещи, как бы.

    Если нужно растянуть один виджет на всё окно (root), то просто
    widget.pack(fill='both', expand=True)
    Ответ написан
  • Как получить html страницы,который не активен через запросы?

    Vindicar
    @Vindicar
    RTFM!
    Блин, "неактивные" = невидимые? Если они есть в коде страницы изначально и только показываются, а не подгружаются динамически через фоновый запрос - то скрипту будет пофиг на это, распарсит всё.
    А вот если они подгружаются фоном, то тут уже труднее.
    Ответ написан
    Комментировать
  • Как разбить двухзначные числа и более на однозначные и добавить их списком в список?

    Vindicar
    @Vindicar
    RTFM!
    У тебя внутренний цикл while разбивает одно число. Перед этим циклом создай новый список, и закидывай числа туда, а не в X. После while закидывай этот список в X.
    Ответ написан
    1 комментарий
  • Как решить данную проблему с SQLite?

    Vindicar
    @Vindicar
    RTFM!
    for row in result:
        singup = str(row[0])

    Молчаливо подразумевает, что в result будет хотя бы одна строка. Это далеко не факт.
    Если result пуст, то singup не будет присвоено значение.
    Ответ написан
    Комментировать
  • Как достать значение ключа из словаря?

    Vindicar
    @Vindicar
    RTFM!
    Вообще очень странная конструкция. Если ключи верхнего уровня гарантированно уникальны, проще будет сделать так:
    my_lst = [ ... тут твой список ... ]
    my_dct = {}
    for item in my_lst:
        my_dct.update(item)

    И тогда можно будет просто оперировать my_dct.keys(). Например,
    keys = list(map(int, my_dct.keys()))
    print(f"{min(keys)}...{max(keys)}")
    Ответ написан
    1 комментарий
  • Как удалить временные файлы?

    Vindicar
    @Vindicar
    RTFM!
    Используй модуль tempfile, он умеет прибирать за собой. Но это лучше всего работает, если тебе нужен именно файловый объект, а не именованный файл в файловой системе. Есть, конечно, класс tempfile.NamedTempFile, но там свои заморочки.
    Ответ написан
    Комментировать
  • UnboundLocalError: local variable referenced before assignment что делать?

    Vindicar
    @Vindicar
    RTFM!
    Если цикл for block in soup.find_all не выполнится ни разу (например, нет подходящих элементов), то task_stack не будет присвоено значение. А ты дальше его читаешь.
    Предусмотри какое-то значение по умолчанию для этой переменной, и проверяй такой случай.
    Ответ написан
    Комментировать
  • Нажимаю на кнопку она не работает, при этом схема собрана правильно, Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    Проверь документацию, может, номер пина не тот? Номер бита в регистре цифрового ввода вывода - это не то же самое, что номер пина на плате.
    И я без понятия, какую нумерацию использует питоновская обертка. Но судя по отсутствию указания модели платы в коде, вряд ли номер пина на плате...
    Ответ написан
    Комментировать
  • Как реализовать систему изменения данных в базе данных?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, если ты используешь aiogram, то про многопоточность лучше забыть. Асинхронность с многопоточностью сочетается довольно плохо. Это возможно, но нетривиально, и новичкам лучше не связываться.
    Во-вторых, дай угадаю - задержку в цикле фарминга реализуешь через time.sleep()? Если да, то конечно, цикл асинхронной программы останавливается на это время. Вот почему предусмотрена функция asyncio.sleep(), которая может приостановить выполнение отдельной корутины, не трогая остальных.
    В-третьих, если тебе нужно выполнить корутину и дождаться результата её выполнения - используй оператор await. Если же тебе нужно запланировать выполнение корутины и идти дальше, не дожидаясь её результата (выполнение "как только, так сразу") - лучше использовать asyncio.get_event_loop().create_task().

    Думаю, остальное сможешь додумать сам.
    Ответ написан
    5 комментариев
  • Как динамически вызвать функцию из подключенной dll?

    Vindicar
    @Vindicar
    RTFM!
    Ну так-то модуль ctypes в помощь, но ты сначала научись выражать свои мысли...
    вызвать переменную, которая вернется как integer = 0?
    Ответ написан
    Комментировать
  • Что делает "..." в Python?

    Vindicar
    @Vindicar
    RTFM!
    Вообще обычно это заглушка. Но это уникальное значение (как None), и его можно использовать для своих целей, при желании.
    Например, в numpy он используется так: если у нас есть массив с 3 измерениями, и мы хотим задать срез по третьему измерению, мы можем записать либо так array[:, :, 0] либо так array[..., 0].
    По-моему, еще в typing есть применения.
    Ответ написан
    Комментировать
  • Как сделать активность бота на discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Плохо искал.
    Client.change_presence (наследуется классом Bot)
    BaseActivity - предок возможных активностей.
    Ответ написан
    Комментировать
  • Что делает команда cls < NUL?

    Vindicar
    @Vindicar
    RTFM!
    Ну вообще < - это перенаправление ввода программы, так же как > - перенаправление стандартного вывода программы. NUL - это устройство (псевдофайл), точнее пустое устройство. Вывод в него не даёт ничего, а ввод эквивалентен чтению пустого файла.
    Вот только зачем это cls...
    Ответ написан
    Комментировать
  • Как связать несвязанные друг с другом теги через bs4?

    Vindicar
    @Vindicar
    RTFM!
    Если вся эта красота лежит в одном родителе (ну или ты можешь засунуть всё это в один список в правильном порядке), то тривиально.
    sections = []
    current_section = None
    paragraphs = []
    for tag in tags: # перебираем теги, которые надо обработать
        if tag.name == 'h2':
            if current_section is not None:
                sections.append( (current_section, paragraphs) )
            current_section = tag
            paragraphs = []
        elif tag.name == 'p':
            paragraphs.append(tag)
    if current_section is not None:
        sections.append( (current_section, paragraphs) )

    В secitons будет лежать список кортежей вида (заголовок, список параграфов) в том порядке, в котором они идут в тексте. Твоя забота - обеспечить правильное значение tags.
    Ответ написан
    Комментировать
  • Как выводить сообщение без остановки?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых ты творишь какой-то колхоз. discord.py тащит как зависимость асинхронную aiohttp, а ты сначала используешь синхронный requests, а потом заворачиваешь его в асинхрон через ThreadPool, потом обратно заворачиваешь в синхронный код в main(), а потом этот main() хочешь использовать вместе с асинхронным кодом discord.py. Жесть.
    Вот не проще осилить изначально асинхронную библиотеку, которую и так и так придётся использовать?

    Далее, что за бредятина с while? Что, по-твоему, должен делать вызов on_ready() в цикле? Что еще за точки с запятыми в питоне?
    Ты делаешь чисто синхронный бесконечный цикл, естественно этот цикл не даёт асинхронному коду исполняться.

    Ну и до кучи зачем-то используешь discord.Client вместо discord.Bot.

    Даже базового знания того, как работает асинхронность в питоне, достаточно, чтобы набросать код вида:
    import asyncio
    import aiohttp
    import discord
    from discord.ext import commands
    client = commands.Bot(intents = discord.Intents.default())
    
    async def fetch():
        return ... # тут вытаскиваем данные с сайта через aiohttp и возвращаем в удобном нам виде
    
    async def display(results):
        global client
        pass  # тут выводишь результаты в дискорд, используя объект client
    
    async def cycle():
        while True:
            res = await fetch()  # обработку ошибок допиши сам
            await display(res)
            await asyncio.sleep(300)  # задержка в секундах
    
    cycle_task = None
    @client.ready
    async def on_ready():
        global cycle_task
        if cycle_task is None:  # событие ready может отрабатывать несколько раз, нам нужен только один.
            cycle_task = asyncio.get_event_loop().create_task(cycle())
        pass  # тут делаешь что тебе еще нужно по запуску бота
    
    # когда надо будет остановить цикл, вызови cycle_task.cancel()
    bot.run(TOKEN)  # запускаешь бота
    Ответ написан
    Комментировать
  • Как работает wa?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что wa не в курсе, что ты поменял номер, а новый владелец номера не в курсе, что к его номеру привязана учётка в каком-то мессенджере.
    Тащем-то, ещё одна причина почему мессенджеры с привязкой по мобильному - зло.
    Ответ написан
    Комментировать
  • Как сделать цикл не задерживающий программу в Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, что значит "не задерживал"? Если последующий код зависит от результата работы этого цикла, толку всё равно не будет.
    Так что первым делом определись для себя, какие куски кода ты хочешь выполнять параллельно и почему. Вынеси эти фрагменты в отдельные функции.
    Далее, реализовать более-менее параллельное выполнение можно через threading.Thread, но там есть целый ряд подводных камней. В первую очередь, доступ на запись (или на чтение и запись) к одной и той же переменной из двух потоков. Во вторую, как следствие - умение передать исходные данные в другой поток и дождаться результата работы из другого потока. В третью - объекты из некоторых библиотек нормально работают только в пределах одного потока, передавать их между потоками нельзя.
    Ответ написан
    Комментировать
  • Python — Невозможно создать экземпляр абстрактного класса ... с помощью абстрактных методов?

    Vindicar
    @Vindicar
    RTFM!
    Отступы косые, будь внимательнее.
    У тебя check() объявлена как локальная функция внутри __init__(), соответственно в самом классе такого метода нет. А так как метод объявлен абстрактным в BoundFilter и не переопределён в твоём классе, то и твой класс остаётся абстрактным. А потому попытка создать его экземпляр проваливается.
    Ответ написан
    Комментировать
  • Как реализовать сеть по генерации геометрического изображения из скетча?

    Vindicar
    @Vindicar
    RTFM!
    Нейронные сети тебе не помогут, если ты не знаешь, как извлечь исходную информацию из изображения. Да и потом, где ты найдешь несколько десятков/сотен тысяч изображений для обучения сети? Нейронки - это не магия, чтобы вжух и оно само. -_-

    Я бы попробовал найти все встречающиеся цвета пикселей и кластеризовать их, но дело осложняется тем, что заранее неизвестно количество используемых цветов. После этого можно будет выделить каждую черкотню отдельно, сравнив цвет пикселя с центром того или иного кластера, а потом разделив отдельные фрагменты через поиск связных компонентов.
    Далее можно взять за основу вот этот алгоритм.
    ну или немного иначе

    Для каждого фрагмента определи описывающий выпуклый многоугольник, чтобы избежать мути с неровной штриховкой внутри.
    Затем переведи этот многоугольник в полярные координаты. Для этого найди центр масс этого многоугольника. Потом из этой точки пускаешь наружу лучи, по кругу, с некоторым шагом (скажем 1 градус), и считаешь расстояние от центра масс до точки пересечения луча с многоугольником. Ты получишь своего рода профиль фигуры, зависимость расстояния от центра фигуры от направления, в котором мы смотрим.
    Этот профиль можно сравнить с профилями заранее известных фигур - треугольников, прямоугольников, эллипсов - чтобы понять, на что фрагмент походит больше всего.
    Чтобы сравнение было проще, стоит сделать так. Сдвинь многоугольник так, чтобы центр масс попал в (0;0). Найди вершину многугольника, которая наиболее удалена от центра. Поверни многоугольник так, чтобы она смотрела, скажем, под уголом 45 градусов (вверх и вправо). Запомни этот угол поворота.
    Потом сожми многоугольник так, чтобы он вписывался в квадрат 1 х 1 единицу. Так как ты работаешь с координатами вершин, а не с пикселями, это не проблема. Запомни, насколько ты сжал многоугольник.
    Теперь, когда ориентация, размер и отношение сторон фрагмента известны, можно сравнивать его с заранее подготовленными профилями фигур - квадратом, кругом, разными треугольниками. Например, находишь разность между значением профиля фигуры и значением профиля фрагмента для этого же направления. Суммируешь эти разности по модулю. Чем меньше сумма - тем более профиль похож.
    Определив наиболее похожую фигуру, растягиваешь её так же, как сжимал многоугольник. Потом поворачиваешь назад на столько же, на сколько повернул многоугольник. Потом смещаешь, чтобы центр фигуры попал на центр масс. Если всё сделано правильно, фигура ляжет "поверх" фрагмента рисовки. Осталось только её обвести тем же цветом.
    С заливкой и перекрытиями будет сложнее, но их можно добавить, оттолкнувшись от этого алгоритма.
    Ответ написан
    Комментировать