def check_goban_moved(prev_corners, current_corners): """Comprobamos si es posible el movimiento de tablero detectado. :Param prev_corners: corners detectados anteriormente :Type prev_corners: list :Param current_corners: corners detectados actualmente :Type current_corners: list :Return: True si el tablero se ha movido :Rtype: bool """ if not prev_corners or not current_corners: return True dist_min_of_movement = get_max_edge(prev_corners) / (2 * GOBAN_SIZE) " Comprobamos primero si existe mucho movimiento. " dist = [] directions = [] for i in xrange(NUM_EDGES): dist.append(abs(distance(prev_corners[i], current_corners[i]))) directions.append(direction(prev_corners[i], current_corners[i])) f = lambda x: x > 1 dist_list = filter(f, dist) if len(dist_list) > 2: # min_mov=1/3 square TODO check impossible movement (Direcction) min_mov = get_max_edge(prev_corners) / ((GOBAN_SIZE - 1) * 3.0) dist_list.sort() if (dist_list[-1] - dist_list[0]) < min_mov: return check_directions(directions) elif (dist_list[-1] - dist_list[-3]) < min_mov: return check_directions(directions) else: return False else: return False
def check_goban_moved(prev_corners, current_corners): """Comprobamos si es posible el movimiento de tablero detectado. :Param prev_corners: corners detectados anteriormente :Type prev_corners: list :Param current_corners: corners detectados actualmente :Type current_corners: list :Return: True si el tablero se ha movido :Rtype: bool """ if not prev_corners or not current_corners: return True dist_min_of_movement = get_max_edge(prev_corners)/(2*GOBAN_SIZE) " Comprobamos primero si existe mucho movimiento. " dist = [] directions = [] for i in xrange(NUM_EDGES): dist.append(abs(distance(prev_corners[i], current_corners[i]))) directions.append(direction(prev_corners[i], current_corners[i])) f = lambda x: x>1 dist_list = filter(f, dist) if len(dist_list) > 2: # min_mov=1/3 square TODO check impossible movement (Direcction) min_mov = get_max_edge(prev_corners)/((GOBAN_SIZE-1)*3.0) dist_list.sort() if (dist_list[-1] - dist_list[0]) < min_mov: return check_directions(directions) elif (dist_list[-1] - dist_list[-3]) < min_mov: return check_directions(directions) else: return False else: return False
def perspective(img, corners): """Crea una imagen en modelo ideal del tablero dado en perspectiva. :Param img: imagen con el tablero en perspectiva :Todo: comprobar de que tipo es la imagen TODO :Type img: IplImage or CvMat :Param corners: lista de las esquinas del tablero :Type corners: list :Return: imagen en modelo ideal :Rtype: IplImage """ max_edge = get_max_edge(corners) corners = get_external_corners(corners) # The goban have a relation 15/14 height/width relation = 14/15.0 # In the sequence, the orden of corners are ul, dl, dr, ur corners_transf = ((0,0),(0,max_edge),(max_edge,0),(max_edge,max_edge)) mat = CreateMat(3, 3, CV_32FC1) GetPerspectiveTransform( corners, corners_transf, mat) src = CreateImage((max_edge, max_edge), img.depth, img.nChannels) WarpPerspective(img, src, mat) return src
def perspective(img, corners): """Crea una imagen en modelo ideal del tablero dado en perspectiva. :Param img: imagen con el tablero en perspectiva :Todo: comprobar de que tipo es la imagen TODO :Type img: IplImage or CvMat :Param corners: lista de las esquinas del tablero :Type corners: list :Return: imagen en modelo ideal :Rtype: IplImage """ max_edge = get_max_edge(corners) corners = get_external_corners(corners) # The goban have a relation 15/14 height/width relation = 14 / 15.0 # In the sequence, the orden of corners are ul, dl, dr, ur corners_transf = ((0, 0), (0, max_edge), (max_edge, 0), (max_edge, max_edge)) mat = CreateMat(3, 3, CV_32FC1) GetPerspectiveTransform(corners, corners_transf, mat) src = CreateImage((max_edge, max_edge), img.depth, img.nChannels) WarpPerspective(img, src, mat) return src