Сравнить два рисунка и сообщить совпадают ли они- Python
| |
esgik | Дата: Понедельник, 04 Апреля 2016, 15:27 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте,помогите решить проблему: необходимо сравнить имеющийся "зигзаг" с нарисованным мышью, и сообщить пользователю на сколько он совпадает,или наоборот отличается. :(
Код import pygame, random pygame.init() # Определить некоторые цвета black = (0,0,0) white = (255,255,255) green = (0,255,0) red = (255,0,0) blue = (0,0,255) size=[700,500] screen=pygame.display.set_mode(size) pygame.display.set_caption("Obychenie") screen.fill(white)# Очистить экран и установить фон done = False last_pos = (0, 0) color = (black)# цвет отпечатка мыши radius = 2 def roundline(srf, color, start, end, radius): dx = end[0]-start[0] dy = end[1]-start[1] distance = max(abs(dx), abs(dy)) for i in range(distance): x = int( start[0]+float(i)/distance*dx) y = int( start[1]+float(i)/distance*dy) pygame.draw.circle(srf, color, (x, y), radius) try: while True: e = pygame.event.wait() if e.type == pygame.QUIT: raise StopIteration if e.type == pygame.MOUSEBUTTONDOWN: pygame.draw.circle(screen, color, e.pos, radius) done = True if e.type == pygame.MOUSEBUTTONUP: done = False if e.type == pygame.MOUSEMOTION: if done: pygame.draw.circle(screen, color, e.pos, radius) roundline(screen, color, e.pos, last_pos, radius) last_pos = e.pos for y_offset in range(10,280,20): pygame.draw.line(screen,green,[280,10+y_offset],[420,20+y_offset],2) for y_offset in range(20,280,20): pygame.draw.line(screen,green,[280,20+y_offset],[420,10+y_offset],2) pygame.draw.rect(screen,black,[50,20,250,280],2) pygame.draw.rect(screen,black,[400,20,250,280],2) pygame.draw.rect(screen,blue,[280,20,40,280],1) pygame.draw.rect(screen,blue,[380,20,40,280],1) pygame.display.flip() except StopIteration: pass pygame.quit()
Сообщение отредактировал esgik - Понедельник, 04 Апреля 2016, 15:27 |
|
| |
Lertmind | Дата: Понедельник, 04 Апреля 2016, 19:49 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Написал простое сравнение. Перед try создаю два изображения Surface размером с окно, закрашиваю белым, на одном будет рисоваться ввод пользователя, на другом нарисован эталон линий (в обоих случаях закрашиваю чёрным). По нажатию пробела сравниваю каждый пиксель и подсчитываю сколько пикселей совпадает, сколько не закрашено и сколько закрашено лишнего за границами эталона. Первые два числа при сложении дают сколько всего пикселей у эталона, если первое число разделить на общее число, то получим отношение насколько закрашено, а третье число делённое на общее - отношение ошибки за границами. Если закрашено 100%, но ошибка за границами больше какого-то порога, то значит не удалось.
Код # coding: utf-8 import pygame, random pygame.init() # Определить некоторые цвета black = (0,0,0) white = (255,255,255) green = (0,255,0) red = (255,0,0) blue = (0,0,255) size=[700,500] screen=pygame.display.set_mode(size) pygame.display.set_caption("Obychenie") screen.fill(white)# Очистить экран и установить фон done = False last_pos = (0, 0) color = (black)# цвет отпечатка мыши radius = 2 def roundline(srf, color, start, end, radius): dx = end[0]-start[0] dy = end[1]-start[1] distance = max(abs(dx), abs(dy)) for i in range(distance): x = int( start[0]+float(i)/distance*dx) y = int( start[1]+float(i)/distance*dy) pygame.draw.circle(srf, color, (x, y), radius)
# Surface на котором пользователь рисует sf_input = pygame.Surface(size) sf_input.fill(white) # Surface на котором эталонный рисунок sf_origin = pygame.Surface(size) sf_origin.fill(white) for y_offset in range(10,280,20): pygame.draw.line(sf_origin,black,[280,10+y_offset],[420,20+y_offset],2) for y_offset in range(20,280,20): pygame.draw.line(sf_origin,black,[280,20+y_offset],[420,10+y_offset],2)
try: while True: e = pygame.event.wait() if e.type == pygame.QUIT: raise StopIteration if e.type == pygame.MOUSEBUTTONDOWN: pygame.draw.circle(screen, color, e.pos, radius) # sf_input pygame.draw.circle(sf_input, black, e.pos, radius) done = True if e.type == pygame.MOUSEBUTTONUP: done = False if e.type == pygame.MOUSEMOTION: if done: pygame.draw.circle(screen, color, e.pos, radius) roundline(screen, color, e.pos, last_pos, radius) # sf_input pygame.draw.circle(sf_input, black, e.pos, radius) roundline(sf_input, black, e.pos, last_pos, radius) last_pos = e.pos for y_offset in range(10,280,20): pygame.draw.line(screen,green,[280,10+y_offset],[420,20+y_offset],2) for y_offset in range(20,280,20): pygame.draw.line(screen,green,[280,20+y_offset],[420,10+y_offset],2) pygame.draw.rect(screen,black,[50,20,250,280],2) pygame.draw.rect(screen,black,[400,20,250,280],2) pygame.draw.rect(screen,blue,[280,20,40,280],1) pygame.draw.rect(screen,blue,[380,20,40,280],1)
if e.type == pygame.KEYDOWN: if e.key == pygame.K_SPACE: # Сравнение matched = 0 # Пиксели совпали с эталоном, inside_failure = 0 # не совпали внутри, outside_failure = 0 # ушли за границы for x in range(0, size[0]): for y in range(0, size[1]): color_input = sf_input.get_at((x, y)) color_origin = sf_origin.get_at((x, y)) if color_input == black and color_origin == black: matched += 1 elif color_input == white and color_origin == black: inside_failure += 1 elif color_input == black and color_origin == white: outside_failure += 1 total = matched + inside_failure # Пикселей в эталоне print str.format("{0:.2%}, {1:.2%}", matched / float(total), outside_failure / float(total))
pygame.display.flip() except StopIteration: pass pygame.quit() Добавлено (04 апреля 2016, 19:49) --------------------------------------------- Если нужно подсчитывать на ходу, то необходимо во время ввода подсчитывать.
|
|
| |
кое-кто | Дата: Понедельник, 04 Апреля 2016, 21:53 | Сообщение # 3 |
Сейчас нет на сайте
| В питоне есть специальная библиотека PIL (Python Imaging Library) как раз для таких целей. Вот статья на харбе
Моя группа
|
|
| |
Ordan | Дата: Вторник, 05 Апреля 2016, 01:25 | Сообщение # 4 |
Главный зомби
Сейчас нет на сайте
| Я знатный извращенец и сделал бы проверку на цвет пикселей.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
Мои проекты ТЫК Мои видяхи на ютубэ ТЫК
Если ты споришь с идиотом, вероятно тоже самое делает и он.
|
|
| |
|