Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/140: Рейтинг темы: голосов - 140, средняя оценка - 4.78
26 / 26 / 23
Регистрация: 28.09.2016
Сообщений: 91

Поиск фрагмента в изображении

10.11.2016, 20:46. Показов 29095. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Т.к. не нашёл удовлетворяющего меня решения, сделал сам. Выкладываю, может кому пригодится.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from PIL import Image
 
def pic_detect(search_file,template_file,step=5):
    
    img_0 = Image.open(search_file)
    img_1 = Image.open(template_file)
    img_mem_0 = img_0.load()
    img_mem_1 = img_1.load()
    rgb0 = [0,0,0]
    rgb1 = img_1.getpixel((1,1))
    size_pic = img_0.size
    size_pic_tpl = img_1.size
    
    for y in range(size_pic[1]-size_pic_tpl[1]):
        for x in range(size_pic[0]-size_pic_tpl[0]):
            rgb0 = img_mem_0[x,y]
            br = False
            if rgb0 == rgb1:
                for i in range(0,size_pic_tpl[1]-1,int(size_pic_tpl[1]/step)):
                    for e in range(0,size_pic_tpl[0]-1,int(size_pic_tpl[0]/step)):
                        if img_mem_0[x+e,y+i] == img_mem_1[e+1,i+1]:
                            pass
                        else:
                            br = True
                            break
                    if br:
                        break
                if br == False:
                    # Попиксельная сверка для 100% совпадения, в большинстве случаев это излишне
                    # for ii in range(size_pic_tpl[1]-1):
                        # for ee in range(size_pic_tpl[0]-1):
                            # if img_mem_0[x+ee,y+ii] == img_mem_1[ee+1,ii+1]:
                    return (x,y)
 
                    
print (pic_detect('search.png','template.png'))
search.png - оригинальное изображение
template.png - фрагмент

Для ускорения желательно что бы RGB 1-го пикселя в фрагменте не совпадало с RGB фона оригинального изображения, хотя и так быстро работает
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2016, 20:46
Ответы с готовыми решениями:

Поиск изображения в изображении
Необходимо вычислить координаты изображения Б в изображении А. Изображение А - картинка в формате JPG. Изображение Б - картинка в формате...

Поиск объекта на изображении
Нужно найти объект на изображении и вывести его координаты. Написал такой скрипт: def coordinates(main_img, img): object =...

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

3
Заблокирован
11.11.2016, 04:36
Когда не знал про template matching в opencv и написал медленный и хуже работающий велосипед)))
0
9 / 9 / 3
Регистрация: 24.01.2015
Сообщений: 79
Записей в блоге: 6
12.11.2016, 12:55
Код работает с захватами экрана, ищет предварительно загруженные части изображения.

Python
1
2
    zast=autopy.bitmap.capture_screen(rect_vert)
    pos_zamok_sl = zast.find_bitmap(zamok,0.001)
Захват экрана и поиск предварительно загруженного изображения с задаваемой точностью.



В Компасе при выходе из эскиза исчезает маленькое изображение.
По этому событию включается программа проверки путем эмуляции нажатия клавиш.


Проверять эскизы можно и без нажатия клавиш.
https://www.cyberforum.ru/blog... g4415.html

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import autopy
import time
import ctypes
from autopy import mouse
 
 
#_________________________________________________________________________
def Poisk(imfile):
    filee=autopy.bitmap.Bitmap.open(imfile)
    for n in range(68):
        zast=autopy.bitmap.capture_screen()
        pos = zast.find_bitmap(filee,0.001)
        if type(pos)==tuple:
            a=1
            break
        else:
            pass
    return pos
 
#_________________________________________________________________________
def Levoj(x,y,t):
    ctypes.windll.user32.SetCursorPos(x, y)
    time.sleep(t)
    ctypes.windll.user32.mouse_event(2, 0, 0, 0,0) # left down
    ctypes.windll.user32.mouse_event(4, 0, 0, 0,0) # left up
#_________________________________________________________________________
def Pravoj(x,y,t):
    ctypes.windll.user32.SetCursorPos(x, y)
    time.sleep(t)
    ctypes.windll.user32.mouse_event(0x08, 0, 0, 0,0) # left down
    ctypes.windll.user32.mouse_event(0x10, 0, 0, 0,0) # left up
#_________________________________________________________________________
def Enter_():
    time.sleep(0.001)
    time.sleep(0.001)
    time.sleep(0.001)
    ctypes.windll.user32.keybd_event(0x0D, 0, 0, 0)         #'наж enter
    time.sleep(0.001)
    time.sleep(0.001)
    time.sleep(0.001)
    ctypes.windll.user32.keybd_event(0x0D, 0,0x0002, 0)     #'Отпускаем enter
    time.sleep(0.001)
 
 
 
 
 
zamok  =autopy.bitmap.Bitmap.open("D:/zamok.bmp")
zamknut=autopy.bitmap.Bitmap.open("D:/zamknut.bmp")
net_   =autopy.bitmap.Bitmap.open("D:/net_.bmp")
ok   =autopy.bitmap.Bitmap.open("D:/ok.bmp")
 
 
rect_vert=(0,0),(100,720)
rect_gor=(0,0),(1200,150)
 
zast=autopy.bitmap.capture_screen(rect_vert)
pos_zamok_pr = zast.find_bitmap(zamok,0.001)
 
for n in range(1128600):
 
    zast=autopy.bitmap.capture_screen(rect_vert)
    pos_zamok_sl = zast.find_bitmap(zamok,0.001)
 
 
    if type(pos_zamok_pr)==tuple:
        if type(pos_zamok_sl)==tuple:
            pass
        else:
            ctypes.windll.user32.SetCursorPos(555,555)
        #    time.sleep(0.2)
            ctypes.windll.user32.mouse_event(0x08, 0, 0, 0,0)
            ctypes.windll.user32.mouse_event(0x10, 0, 0, 0,0)
 
 
            pos=Poisk('D:/redaktirovat.bmp')
            time.sleep(0.7)
            Levoj(pos[0]+7, pos[1]+5,0.4)
            time.sleep(0.5)
 
            zast_gor=autopy.bitmap.capture_screen()
            pos_zamknut = zast_gor.find_bitmap(zamknut,0.01)
 
            Levoj(pos_zamknut[0]+7, pos_zamknut[1]+5,0.4)
 
            for cik in range(11):
                zast=autopy.bitmap.capture_screen()
                pos_net = zast.find_bitmap(net_,0.001)
                pos_ok = zast.find_bitmap(ok,0.001)
                print ("net",pos_net)
                print ("ok",pos_ok)
                if type(pos_net)==tuple:
                    break
                if type(pos_ok)==tuple:
                    Enter_()
 
                    Pravoj(368,386,0.4)
 
                    Levoj(368+22,386+122,0.4)
 
                    time.sleep(0.1)
 
 
 
    pos_zamok_pr=pos_zamok_sl
Вложения
Тип файла: zip Компас Экиз Проверка (2).zip (83.4 Кб, 44 просмотров)
2
26 / 26 / 23
Регистрация: 28.09.2016
Сообщений: 91
08.12.2016, 18:14  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# coding=utf-8
from PIL import Image
import time
 
 
def eq_pic(size_t, step_x, step_y, img_mem_s, img_mem_t, x, y):
    for i in range(0, size_t[1] - 1, step_y):
        for e in range(0, size_t[0] - 1, step_x):
            if img_mem_s[e + x, i + y] != img_mem_t[e + 1, i + 1]:
                return False
    return True
 
 
def pic_detect(search_file, template_file, step=3):
    """
    :param step: for x: step_x = int(size_t[0]/step), if step == 0: step_x = 1;
                 for y: step_y = int(size_t[1]/step), if step == 0: step_y = 1
    :return: coordinate pic(template_file) in screen(search_file)
    """
    img_s = Image.open(search_file)
    img_t = Image.open(template_file)
    img_mem_s = img_s.load()
    img_mem_t = img_t.load()
    rgb_t = img_t.getpixel((1, 1))
    size_s = img_s.size
    size_t = img_t.size
 
    if step != 0:
        step_x = int(size_t[0]/step)
        step_y = int(size_t[1]/step)
    else:
        step_x = step_y = 1
 
    for y in xrange(size_s[1] - size_t[1]):
        for x in xrange(size_s[0] - size_t[0]):
            rgb_s = img_mem_s[x, y]
            if rgb_s == rgb_t:
                if eq_pic(size_t, step_x, step_y, img_mem_s, img_mem_t, x, y):
                    if step == 0:
                        return [x, y]
                    if eq_pic(size_t, 1, 1, img_mem_s, img_mem_t, x, y):
                        return [x, y]
    return False
 
 
if __name__ == '__main__':
    start_time = (time.time())
    print(pic_detect('search.png', 'template.png'))
    print(time.time() - start_time)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2016, 18:14
Помогаю со студенческими работами здесь

Поиск шаблона на изображении - Python3.5
Всем доброго времени суток! Прошу помощи по решению несложной (для вас-то :) ) задачи: эта задача реализуется (предполагается) на...

Поиск извесного элемента на изображении
Здравствуйте! Допустим, есть скриншот форума и есть отдельная картинка с чьи-нибудь аватаром. Для простоты вырезанная из того же...

Поиск фрагмента в изображении
Использую библиотеку fftw. Хочу написать программу, которая бы быстро находила фрагмент в большом изображении. При это данный фрагмент -...

Поиск однотипного фрагмента на изображении
Приветствую, форумчане! Подскажите, пожалуйста, каким способом можно решить следующую задачу: Есть несколько тысяч фотографий с...

Почему не так работает? Поиска фрагмента в полном изображении (OpenCV)
Есть такой алгоритм: Пусть даны два изображения X и Y – изображение и образец, размеров (N1,N2) и (M1,M2) соответственно и Ni > Mi ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru