Exemple #1
0
def paint_voronoi(subdiv, contour, img):
    total = len(list(subdiv.edges))
    print 'processing {} edges'.format(total)
    #    elem_size = subdiv.edges.elem_size;

    lines = []

    counter = 0
    for edge in subdiv.edges:
        org = (round(cv.Subdiv2DEdgeOrg(edge).pt[0]),
               round(cv.Subdiv2DEdgeOrg(edge).pt[1]))
        dst = (round(cv.Subdiv2DEdgeDst(edge).pt[0]),
               round(cv.Subdiv2DEdgeDst(edge).pt[1]))

        lines += draw_subdiv_facet(img, contour,
                                   cv.Subdiv2DRotateEdge(edge, 1))
        lines += draw_subdiv_facet(img, contour,
                                   cv.Subdiv2DRotateEdge(edge, 3))
        counter += 1
        if counter % 100 == 0:
            print '... do {} so far'.format(counter)

    print "Shaving lines"
    while len(lines) > 0:
        oldsize = len(lines)
        lines = shave_lines(lines)
        if len(lines) / float(oldsize) > shave_until: break
    print "Done shaving lines"

    vertex_ids = {}
    vertices_by_id = []
    vertex_id = 0
    seen_lines = {}
    edges = []
    f = open("kde-inferred.graph", 'w')
    for line in lines:
        if line in seen_lines: continue
        else:
            seen_lines[line] = 1

        cv.Line(img, line[0], line[1], (255, 0, 0), 1, cv.CV_AA)
        if not line[0] in vertex_ids:
            vertex_ids[line[0]] = vertex_id
            vertices_by_id.append(line[0])
            vertex_id += 1
        if not line[1] in vertex_ids:
            vertex_ids[line[1]] = vertex_id
            vertices_by_id.append(line[1])
            vertex_id += 1
        edges.append((vertex_ids[line[0]], vertex_ids[line[1]]))
    for vertex in vertices_by_id:
        f.write("{} {}\n".format(vertex[0] / xscale + min_x,
                                 (height - vertex[1]) / yscale + min_y))
    f.write("\n")
    for edge in edges:
        f.write("{} {}\n".format(edge[0], edge[1]))
    f.close()
Exemple #2
0
def paint_voronoi(subdiv, contour, img):
    total = len(list(subdiv.edges))
    #    elem_size = subdiv.edges.elem_size;

    lines = []

    for edge in subdiv.edges:
        org = (round(cv.Subdiv2DEdgeOrg(edge).pt[0]),
               round(cv.Subdiv2DEdgeOrg(edge).pt[1]))
        dst = (round(cv.Subdiv2DEdgeDst(edge).pt[0]),
               round(cv.Subdiv2DEdgeDst(edge).pt[1]))

        lines += draw_subdiv_facet(img, contour,
                                   cv.Subdiv2DRotateEdge(edge, 1))
        lines += draw_subdiv_facet(img, contour,
                                   cv.Subdiv2DRotateEdge(edge, 3))

    print "Shaving lines"
    #    while True:
    #        oldsize = len(lines)
    #    	lines=shave_lines(lines)
    #	if len(lines)/float(oldsize) > shave_until: break
    print "Done shaving lines"

    vertex_ids = {}
    vertex_id = 0
    seen_lines = {}
    edge_file = open("output/edges.txt", 'w')
    for line in lines:
        if line in seen_lines: continue
        else:
            seen_lines[line] = 1

        cv.Line(img, line[0], line[1], (255, 0, 0), 1, cv.CV_AA)
        if not line[0] in vertex_ids:
            vertex_ids[line[0]] = vertex_id
            vertex_id += 1
        if not line[1] in vertex_ids:
            vertex_ids[line[1]] = vertex_id
            vertex_id += 1
        edge_file.write( ` vertex_ids[line[0]] ` + " " +
                         ` vertex_ids[line[1]] ` + '\n')
    edge_file.close()

    vertex_file = open("output/vertices.txt", 'w')
    for vertex in vertex_ids:
        vertex_file.write( ` vertex_ids[vertex] ` + " " +
                           ` (height - vertex[1]) / yscale + min_lat ` + " " +
                           ` vertex[0] / xscale + min_lon ` + '\n')
    vertex_file.close()
Exemple #3
0
def draw_subdiv_facet(img, contour, edge):
    lines = []
    t = cv.Subdiv2DGetEdge(edge, cv.CV_NEXT_AROUND_LEFT)
    last_t = None
    while t != edge:
        assert t > 4
        if t == last_t:
            break
        last_t = t
        pt = cv.Subdiv2DEdgeOrg(t)
        pt2 = cv.Subdiv2DEdgeDst(t)
        if pt == None or pt2 == None: break

        line = ((cv.Round(pt.pt[0]), cv.Round(pt.pt[1])),
                (cv.Round(pt2.pt[0]), cv.Round(pt2.pt[1])))

        # cv.Line( img, line[0], line[1], (0,255,0),1,cv.CV_AA);

        # if it's inside the top contour, check that it's not in a hole.
        # if it's in a hole, see if there's an inside shape, and so on
        def test_edge(seq, adding, level):
            if seq == None:
                return adding

            dst1 = cv.PointPolygonTest(seq, pt.pt, 1)
            dst2 = cv.PointPolygonTest(seq, pt2.pt, 1)

            if adding and dst1 > 0 and dst2 > 0:
                return False
            elif adding and (dst1 > 0 or dst2 > 0):
                return False
            elif not adding and (dst1 > 0 and dst2 > 0):
                return test_edge(seq.v_next(), adding != True, level + 1)
            else:
                return test_edge(seq.h_next(), adding, level + 1)

        if pt != pt2 and test_edge(contour, False, 0):
            forward_count = sector_count(line)
            reverse_line = (line[1], line[0])
            reverse_count = sector_count(reverse_line)

            # if the count is within a factor of 4, we consider the road bi-directional
            if min(forward_count, reverse_count) > 0 and max(
                    forward_count, reverse_count) / min(
                        forward_count, reverse_count) < 4:
                lines.append(line)
                lines.append(reverse_line)
            # if we don't have a count in either direction, the edge is probably a bit crooked.
            # include it as a bi-directional edge - it'll wash out on a long street
            elif forward_count <= MIN_DIR_COUNT and reverse_count <= MIN_DIR_COUNT:
                lines.append(line)
                lines.append(reverse_line)
            elif forward_count > reverse_count:
                lines.append(line)
            else:
                lines.append(reverse_line)

            t = cv.Subdiv2DGetEdge(t, cv.CV_NEXT_AROUND_LEFT)

    return lines
def draw_subdiv_facet( img, edge ):

    t = edge;
    count = 0;

    # count number of edges in facet
    while count == 0 or t != edge:
        count+=1
        t = cv.Subdiv2DGetEdge( t, cv.CV_NEXT_AROUND_LEFT );

    buf = []

    # gather points
    t = edge;
    for i in range(count):
        assert t>4
        pt = cv.Subdiv2DEdgeOrg( t );
        if not pt: 
            break;
        buf.append( ( cv.Round(pt.pt[0]), cv.Round(pt.pt[1]) ) );
        t = cv.Subdiv2DGetEdge( t, cv.CV_NEXT_AROUND_LEFT );

    if( len(buf)==count ):
        pt = cv.Subdiv2DEdgeDst( cv.Subdiv2DRotateEdge( edge, 1 ));
        cv.FillConvexPoly( img, buf, cv.RGB(random.randrange(256),random.randrange(256),random.randrange(256)), cv.CV_AA, 0 );
        cv.PolyLine( img, [buf], 1, cv.RGB(0,0,0), 1, cv.CV_AA, 0);
        draw_subdiv_point( img, pt.pt, cv.RGB(0,0,0));
def draw_subdiv_edge( img, edge, color ):
    org_pt = cv.Subdiv2DEdgeOrg(edge);
    dst_pt = cv.Subdiv2DEdgeDst(edge);

    if org_pt and dst_pt :
    
        org = org_pt.pt;
        dst = dst_pt.pt;

        iorg = ( cv.Round( org[0] ), cv.Round( org[1] ));
        idst = ( cv.Round( dst[0] ), cv.Round( dst[1] ));

        cv.Line( img, iorg, idst, color, 1, cv.CV_AA, 0 );