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()
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()
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 );