Ответы пользователя по тегу Python
  • Как найти паттерн на картинке с OpenCV?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформи код, нечитаемо. Кнопка </> в помощь.
    Во-вторых, matchTemplate(), насколько я знаю, не-инвариантна к поворотам и масштабу. Иными словами, поворот или изменение размера целевого объекта сломают сопоставление.
    В-третьих, на показанном кадре более одного экземпляра целевого объекта. Так предполагается или нет? Если предполагается, сколько экземпляров ожидается? Потому что разница очень большая с точки зрения методики.

    Варианта тут три.
    1. пытаться обучать под задачу нейронку. А лучше дообучить существующую, скажем, YOLOv5. Но тебе потребуется минимум несколько сотен размеченных изображений объекта в разных комбинациях, плюс в 2-3 раза больше похожих изображений без целевого объекта. Готовить такую базу будет утомительно, да и само обучение требует понимания что ты делаешь.
    2. попробовать зафиксировать угол поворота или масштаб (т.е. допустить, что он всегда одинаков). Тогда другой параметр можно будет подбирать. Например, мы фиксируем масштаб и делаем 16 изображений объекта в разных поворотах, а потом поочерёдно ищем каждый вариант на кадре. Потом анализируем силу откликов - сколько их, насколько они сильные и т.д. Скорее всего, будет медленно
    3. взять за основу поиск по локальным особенностям. Он справляется с масштабом и поворотом, но не справляется с несколькими экземплярами объекта. Это можно забороть, если использовать скользящее окно. Иными словами, находим на кадре узнаваемые точки - локальные особенности (желательно достаточно много и достаточно плотно), используя алгоритмы вроде ORB или SIFT. Затем выбираем те из них, которые попадают в прямоугольную рамку-окно. Затем сверяем эти особенности с особенностями объекта, используя RANSAC или подобный метод. Если получилось хороше совпадение - значит, в этой рамке есть объект или значительная его часть, и мы можем оценить его позицию в кадре в целом. Повторяем процесс, сдвигая рамку, пока оно не "обойдёт" всё изображение. Тоже может быть небыстро, так как нам требуется неоднократный поиск по картинке.
    Ответ написан
    Комментировать
  • Как изменить код для работы с видео?

    Vindicar
    @Vindicar
    RTFM!
    Тебе модель, скорее всего, отдаст экземпляр класса Detections.
    Если его посмотреть, там есть несколько полезных методов, например, render(), который возвращает список обработанных изображений с отрисованными объектами. А ещё у него есть свойства imgs, xywh и names, чтобы получить обработанные изображения, рамки и классы найденного. Экспериментируй с ними
    Не забываем, что модель рассчитана на подачу пачки изображений, просто эта пачка может содержать и только одно изображение. Отсюда и множественное число, и постоянные массивы.
    Ответ написан
    Комментировать
  • Не работают кнопки в тг боте на python как починить?

    Vindicar
    @Vindicar
    RTFM!
    Проблема, я полагаю, та же что и всегда - несколько обработчиков с func=lambda call: True.
    Ответ написан
    Комментировать
  • Статья закончена, а ответ на вопросы нет?

    Vindicar
    @Vindicar
    RTFM!
    Плохой образец для подражания выбрал - там почему-то код на питоне вперемешку с HTML-разметкой.
    Лучше поищи официальные доки и учись по ним.
    Ответ написан
  • Как выполнить шифровку при помощи шифра Вижинера?

    Vindicar
    @Vindicar
    RTFM!
    Делишь задачу на под-задачи. Допустим, у тебя есть строка-исходный текст text и строка-ключ key, а также список строк, содержащий алфавит языка alpha.
    Определяешь функцию, заменяющую символ по шифру:
    # принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ шифротекста
    def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
      if text_char not in alpha:  # незнакомый символ?
        return text_char  # оставляем его как есть
      text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
      return alpha[cypher_char_code]  # возвращаем символ шифротекста

    А дальше применяем эту функцию к строке:
    cipher_text = ''
    for i in range(len(text)):
      cipher_text += viginere_encode(text[i], i, key, alpha)

    Вот и всё. Да, тут много чего можно оптимизировать, но я старался писать как можно проще.

    Полный пример
    alpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    text = 'A SMOKE OF MOTHERLAND IS SWEET FOR US AND PLEASANT'
    key = 'SECRET'
    
    # принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ шифротекста
    def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
      if text_char not in alpha:  # незнакомый символ?
        return text_char  # оставляем его как есть
      text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
      return alpha[cypher_char_code]  # возвращаем символ шифротекста
    
    # принимает символ шифротекста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ открытого текста
    def viginere_decode(cipher_char: str, i: int, key: str, alpha: list[str]) -> str:
      if cipher_char not in alpha:  # незнакомый символ?
        return cipher_char  # оставляем его как есть
      cipher_char_code = alpha.index(cipher_char)  # номер символа шифротекста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу шифротекста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      text_char_code = (cipher_char_code + len(alpha) - key_char_code) % len(alpha)  # номер символа открытого текста
      return alpha[text_char_code]  # возвращаем символ открытого текста
    
    
    cipher_text = ''
    for i in range(len(text)):
      cipher_text += viginere_encode(text[i], i, key, alpha)
    
    decoded_text = ''
    for i in range(len(cipher_text)):
      decoded_text += viginere_decode(cipher_text[i], i, key, alpha)
    
    print(text)
    print(cipher_text)
    print(decoded_text)
    Ответ написан
    1 комментарий
  • Как запустить одну и ту же функцию с разными параметрами одновременно?

    Vindicar
    @Vindicar
    RTFM!
    Всё проще.
    У тебя во второй и третьей строке у start() скобки пропущены.

    Вот только цикл while там ну очень не очень. Хотя бы задержку секунд 20 поставь, а то нарвёшься на бан на сайте, или просто подвесишь комп диким числом потоков.
    Ответ написан
    Комментировать
  • Я учу питон, и в данный момент я пытаюсь сделать калькулятор который проверяет данные которые вводит пользователь?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, не надо называть переменные и функции одинаково (num_1 и num_1, num_2 и num_2).
    Во-вторых, переменные, созданные внутри функции, обычно не видны снаружи. Ты правильно пытаешься использовать оператор return, чтобы вернуть значение из функции. Но ты не учёл, что когда функцию вызываешь, результат лучше сохранить в переменную, и потом использовать её.

    number_1 = num_1()
    number_2 = num_2()
    # дальше работаешь с number_1 и number_2
    Ответ написан
    6 комментариев
  • Можно ли на время определенное время перевести пк в спящий режим а потом включить с использованием python?

    Vindicar
    @Vindicar
    RTFM!
    Можно без питона. Посмотри в сторону Планировщика задач в винде, например. Планируешь выполнение утилиты shutdown чтобы отключить комп, а чтобы разбудить - планируешь запуск любой проги и ставишь галку ""Включить компьютер для этой задачи".

    Какой эквивалент для пробуждения в никсах - не знаю, увы. А вот shutdown есть и там.
    Ответ написан
  • Почему я получаю пустую строку?

    Vindicar
    @Vindicar
    RTFM!
    send_length += b' ' * (HEADER - len(send_length))
    Я не вполне понял, но зачем ты сразу после длины сообщения дописываешь пробелы?
    Да ещё с ориентировкой на длину строкового представления длины сообщения?
    Не говоря уже о том, что ты фиксируешь длину сообщения в символах, а передаёшь сообщение в байтах в некоторой кодировке... а ведь есть многобайтовые кодировки, типа utf-8. Там эти длины не будут совпадать, и более того, две строки одной длины в символах могут иметь разную длину в байтах, и наоборот.
    Ну и до кучи, ты передаёшь длину сообщения как строку. А как ты определишь длину этой строки?
    Ответ написан
    Комментировать
  • Почему у меня ошибка и как его пофиксиать?

    Vindicar
    @Vindicar
    RTFM!
    Amur_emk,
    1. Проверь, что файл Computer.PNG находится именно в "Новая папка (2)".
    2. Попробуй указать полный путь, например, так:
    from pathlib import Path
    from sys import argv
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()  # путь к папке скрипта
    path = str(SCRIPT_DIR / 'Computer.PNG')  # путь к файлу в этой папке
    # далее по тексту твоей программы

    Но есть ещё одна проблема. Под капотом там, походу, используется пакет pyscreeze, который, в свою очередь, использует opencv (пакет opencv-python, модуль cv2). А у opencv исторически проблемы с кириллическими путями.
    Так что, возможно, придётся самостоятельно грузить картинку, например, так.
    from pathlib import Path
    from sys import argv
    import numpy
    import cv2
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()  # путь к папке скрипта
    path = str(SCRIPT_DIR / 'Computer.PNG')  # путь к файлу в этой папке
    
    file_data = numpy.fromfile(path, numpy.uint8)  # содержимое файла "как есть"
    image = cv2.imdecode(file_data, cv2.IMREAD_COLOR)  # декодированное содержимое (картинка)
    button = pyautogui.locateOnScreen(image)  # передаём сразу картинку
    pyautogui.click(button)
    Ответ написан
    2 комментария
  • Переменные на кирилице?

    Vindicar
    @Vindicar
    RTFM!
    Позволяет. Использовать эту возможность не советую, и в придачу к приведённым выше причинам добавлю ещё одну, очень простую: ключевые слова и вся стандартная библиотека языка на латинице. Задолбаешься переключать раскладку.
    Ответ написан
    Комментировать
  • Как исправить TypeError: string indices must be integers, not 'str'?

    Vindicar
    @Vindicar
    RTFM!
    1. Прочитать ошибку
    Индексы строки должны быть числами. Ошибка указывает на account['name'].

    2. Осознать ошибку
    Ты ожидаешь, что в account лежит словарь или что-то похожее, а там строка!

    3. Проследить ошибку
    account приходит из for account in accounts. Значит, accounts либо является коллекцией строк, либо является словарём с ключами строками. Надо проверить, что приходит в accounts, либо с помощью пошагового прохода программы, либо с помощью отладочного print().

    4. Исправить ошибку
    Ну это ты уж самостоятельно. Я не знаю, что именно ты ожидаешь от users.find_one().
    Ответ написан
    Комментировать
  • Асинхронные функции и цикл событий. RuntimeWarning: coroutine 'Application.initialize' was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    :0: RuntimeWarning: coroutine 'Application.shutdown' was never awaited
    :0: RuntimeWarning: coroutine 'Application.initialize' was never awaited

    Ты вызываешь указанные функции как обычные (Application.initialize()), а это корутины. Их так вызывать бесполезно. Если ты их вызываешь внутри другой корутины (async def функции), то можешь исправить вызов на await Application.initialize(). Если же ты пытаешься вызвать их из обычной функции (просто def), то все становится куда сложнее...
    Ответ написан
    Комментировать
  • Как воспроизводить код при закрытии приложения?

    Vindicar
    @Vindicar
    RTFM!
    Оставаясь внутри одного процесса - никак. Условно, вызов TerminateProcess() пришибёт целевой процесс без шанса на реакцию, как и некоторые другие ситуации. Ты можешь использовать atexit, как указали выше, но работать с сетью внутри него не получится. Работа с сетью вообще долгая штука.
    Так что единственный вариант - запускать фоновый процесс-мониторилку, корректно отвязав его от основного процесса (чтобы не завершились вместе). Ну и иметь ввиду, что его тоже можно прибить, так что его надо перезапускать совместно. Тогда прибить оба процесса сразу будет труднее, хотя всё ещё возможно.
    Ответ написан
    Комментировать
  • Как в python использовать функции async внутри multiprocessing.Pool?

    Vindicar
    @Vindicar
    RTFM!
    Я очень надеюсь, что у тебя асинхронщина занимается получением данных, а multiprocessing - обработкой. В этом случае тебе не корутины по процессам надо раскидывать, а создавать внутри одной корутины синхронные задачи по обработке. А асинхронке оставить вопросы получение исходных данных/отправки результатов. Так куда практичнее. run_in_executor() в помощь.
    Ответ написан
    Комментировать
  • Как изменить текст в консоли питона?

    Vindicar
    @Vindicar
    RTFM!
    По пунктам:
    1. со стандартным input() такое не прокатит, придётся писать свой или искать сторонние либы.
    2. Если редактировать надо только последнюю строку: вывод символа \r переведёт курсор в начало строки, а \x08 - на один символ влево. Главное, не забудь предотвратить вывод перевода строки, пока не будешь готов. Редактировать предыдущие строки так нельзя.
    3. curses позволяет делать ОЧЕНЬ много, вплоть до отдельных окон в одной консоли, но под виндой из коробки не работает. Вроде был пакет windows_curses, который добавляет поддержку виндового терминала.
    Ответ написан
    1 комментарий
  • Хочу сделать проверку: есть ли канал на сервере или нет в функции для добавления его в БД?

    Vindicar
    @Vindicar
    RTFM!
    Если бот находится на этом сервере, то просто запрашиваешь канал через bot.get_channel() и потому уже проверяешь channel.guild.id на полученном канале.
    Если бота на сервере нет, то я без понятия, возможно ли получить информацию о сервере. Я бы предположил что нет.
    Ответ написан
  • Почему Python выдает ошибку в строке с newPosition?

    Vindicar
    @Vindicar
    RTFM!
    А какого баклажана ты пишешь несколько команд в одну строку? Не надо так делать.
    Ответ написан
  • Как решить задачу на определения ближайшего др сотрудника?

    Vindicar
    @Vindicar
    RTFM!
    # Проверяем, попадает ли день рождения в диапазон
    if start_date <= birth_day_month <= end_date:
        birthdays.append((birth_day_month, name, surname))

    А с какого перепуга ты в список birthdays добавляешь модифицированную дату birth_day_month вместо оригинальной birth_date?
    Ответ написан
    Комментировать
  • Каков должен быть sys.path у чистого Python 3.1x под Windows?

    Vindicar
    @Vindicar
    RTFM!
    [
      '', 
      'D:\\Python312\\python312.zip', 
      'D:\\Python312\\DLLs', 
      'D:\\Python312\\Lib', 
      'D:\\Python312', 
      'D:\\Python312\\Lib\\site-packages', 
      'D:\\Python312\\Lib\\site-packages\\win32', 
      'D:\\Python312\\Lib\\site-packages\\win32\\lib', 
      'D:\\Python312\\Lib\\site-packages\\Pythonwin'
    ]
    Ответ написан
    Комментировать