Среда, 11 Декабря 2024, 23:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Сравнить два рисунка и сообщить совпадают ли они- 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)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг