• Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Если смотреть с этой стороны, то перебор вполне эффективен(т.к. список не сортирован), но задача состоит именно в поиске среди единиц, т.е. подразумевается список в большинстве из единиц.
    На всякий поменяю формулировку вопроса, спасибо.
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Adamos, действительно подразумевается список рандомных положительных чисел. Но вопрос стоит именно о "лишних" элементах среди единиц(частный случай списка). Т.е. на вход подается рандомный список, надо проверить его на наличие "лишних" элементов. set() удобен, но он медленный :C
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Adamos, говорю же,
    вопрос в том, можно ли быстрее
    . Так то может и хватит моего решения, хотя уверенности нет. Но если кто-то найдет решение быстрее указанного, тому хвала и честь
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Ипатьев, в определенной степени да. Но задача "немного" сложнее заданной в вопросе, к которой у меня пока не получилось придумать лучшее решение чем я написал выше. С кем не бывает
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Так сложились обстоятельства :D
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    mayton2019, увы, может из-за специфичности исходных данных, это решение не быстрее указанного в вопросе. Хотя очень лаконично c;
  • Состоит список только лишь из единиц, или нет?

    MiheiSV
    @MiheiSV Автор вопроса
    Denis Melnikov, set() с исходными данными занимает слишком много времени. Решение с О(n) может и подойдет, но до такого бы и я додумался, а вот вопрос в том, можно ли быстрее.
    Оперативно, кстати, спасибо :)
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, если не заструднит:
    Все работает хорошо, красные ники находит. Но когда игрок приближается, его ник поначалу немного прозрачен и программа не успевает его распознать. Как лучше решить эту проблему? Менять шаблон, сделать несколько шаблонов для проверки, или есть еще способы? Регулирование threshold'а не сильно помогает(
    Может есть материалы по этой теме?
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, спасибо. Теперь хотя бы ошибки нету :D
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    Насколько я понимаю, это массив
    spoiler
    img = np.array(sct.grab(monitor))
    содержит ч/б картинку, и именно поэтому выдается ошибка - template цветной, а img ч/б?
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, пусть я и рукожоп, но ошибка все равно осталась(
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, господи, я рукожоп. Спасибо)
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix,
    import time
    import cv2
    import mss
    import numpy as np
    import pyautogui
    
    template = cv2.imread("red_nick.png")
    w, h, _ = template.shape[::-1]
    
    with mss.mss() as sct:
        monitor = {"top": 0, "left": 0, "width": 1680, "height": 980}
    
        while "Screen capturing":
            last_time = time.time()
            img = np.array(sct.grab(monitor))
            print("fps: {}".format(1 / (time.time() - last_time)))
            #gray_frame = cv2.cvtColor(img, cv2.TM_CCOEFF_NORMED)
            res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
            loc = np.where(res >= 0.7)
            #cv2.imshow("Frame1", img)
            for i in zip(*loc[::-1]):
                cv2.rectangle(img, i, (i[0] + w, i[1] + h), (0, 255, 255), -1)
            #cv2.imshow("Frame2", img)
            if cv2.waitKey(1) == 27:
                cv2.destroyAllWindows()
                break
            threshold = 0.7
            is_found = False
            if np.amax(res) > threshold:
                is_found = True
            if is_found == True:
                pyautogui.press('r')
                print('Конец')
                cv2.imshow('Frame', img)
                cv2.waitKey()
                break
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, выдается ошибка "cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgproc\src\templmatch.cpp:1163: error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function 'cv::matchTemplate'"
    :D извини, что сильно нагружаю
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    А, это случаем не ошибка в измерении? Я ведь подаю всего 2 координаты..
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    P.s - если убрать 0 из template = cv2.imread("red_nick.png", 0)
    то выдается такая ошибка
    spoiler
    w, h = template.shape[::-1]
    ValueError: too many values to unpack (expected 2)
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, спасибо,конечно, но про другие метода я знаю(они не подходят, т.к. выделяют не то, что нужно). Проблема в том, что при таком коде:
    import time
    import cv2
    import mss
    import numpy as np
    import pyautogui
    
    template = cv2.imread("red_nick.png", 0)
    w, h = template.shape[::-1]
    
    with mss.mss() as sct:
        monitor = {"top": 0, "left": 0, "width": 1680, "height": 980}
    
        while "Screen capturing":
            last_time = time.time()
            img = np.array(sct.grab(monitor))
            print("fps: {}".format(1 / (time.time() - last_time)))
            #gray_frame = cv2.cvtColor(img, cv2.TM_CCOEFF_NORMED)
            res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
            loc = np.where(res >= 0.7)
            #cv2.imshow("Frame1", img)
            for i in zip(*loc[::-1]):
                cv2.rectangle(img, i, (i[0] + w, i[1] + h), (0, 255, 255), -1)
            #cv2.imshow("Frame2", img)
            if cv2.waitKey(1) == 27:
                cv2.destroyAllWindows()
                break
            threshold = 0.7
            is_found = False
            if np.amax(res) > threshold:
                is_found = True
            if is_found == True:
                pyautogui.press('r')
                print('Конец')
                cv2.imshow('Frame', img)
                cv2.waitKey()
                break

    у меня выдается ошибка -
    spoiler
    cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgproc\src\templmatch.cpp:1163: error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function 'cv::matchTemplate'

    Как это поправить?
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, я реализовал то, что вы написали выше - работает, спасибо. Но возникает другая проблема, как мне сравнивать цветной template с цветным скриншотом? Я сделал так:
    while "Screen capturing":
            last_time = time.time()
            img = np.array(sct.grab(monitor))
            print("fps: {}".format(1 / (time.time() - last_time)))
            res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
            loc = np.where(res >= 0.7)

    и мне выдает ошибку
    spoiler
    cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\imgproc\src\templmatch.cpp:1163: error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function 'cv::matchTemplate'

    Так вот, мне обязательно нужно переводить скриншот в чб, или у меня ошибка в matchTemplate?
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, спасибо, в ближайшее время протестирую. Если будут вопросы, опять же таки - напишу сюда :D
  • Как сравнить массивы в NumPy или обойтись без них?

    MiheiSV
    @MiheiSV Автор вопроса
    SoreMix, да я тоже особо не понимаю как это вобще должно было работать.
    Зачем, вы же делаете matchTemplate, который как раз таки и ищет ваш темплейт "red_nick" на изображении.
    - чтобы алгортм работал по задумке, находя красный ник на изображении, он должен подавать какой-нибудь сигнал, для активации кнопки R. И чтобы это реализовать я начал сравнивать массивы. Вот только сейчас понял, что обосновал это сравнение тем, что при команде
    for i in zip(*loc[::-1]):
                cv2.rectangle(img, i, (i[0] + w, i[1] + h), (0, 255, 255), 10)

    красный ник выделяется на скриншоте И изменяет массив img. Но фактически, массив не изменяется, а красный ник выделяется только на окне вывода. Дремучие дебри.
    Так вот, есть ли в OpenCV команда, чтобы при нахождении "red_nick.png" на скриншоте она отсылала какое-то значение, которое можно было бы проверить в условии и выполнить нажатие R. Или команда, которая будет, при нахождении ника, ссылаться на функцию, которая нажимает кнопку R.
    Не знаю, какие механики используются, но что-то мне подсказывает, что искать одинаковый темплейт с одним ником в ММО идея так себе, ибо ники у всех разные.
    - это работает, если интересно то вот:
    spoiler
    В этой игре(камера как в Diablo 3) ник у персонажа, как и полосы здоровья и маны, находится над головой. Когда игрок приближается к нам, мы замечаем его ник на краю экрана(на том, откуда игрок приближается)так же, как и полосу здровья. Полоса здоровья, в отличии от ника, у всех одинаковая, поэтому я решил искать красные ники по ней.
    P.s цвет самого ника - всегда белый(хоть союзник, хоть враг), а цвет полосы здоровья меняется(красный - враг, фиолетовый - союзник, зеленый - согильдеец, желтый - ник самого игрока

    Ну и искать что либо цветное на черно-белом изображении тоже сомнительно.
    - как уже сказал, брал код из статьи, а там сделано так. Если будут проблемы - просто поменяю это.
    Извиняюсь, что запутал, такова ситуация :D, надеюсь на вашу помощь