"atomic bomb" commit. Reorganized OpenCV directory structure
This commit is contained in:
149
samples/swig_python/delaunay.py
Executable file
149
samples/swig_python/delaunay.py
Executable file
@@ -0,0 +1,149 @@
|
||||
#!/usr/bin/python
|
||||
"""
|
||||
the script demostrates iterative construction of
|
||||
delaunay triangulation and voronoi tesselation
|
||||
|
||||
Original Author (C version): ?
|
||||
Converted to Python by: Roman Stanchak
|
||||
"""
|
||||
from opencv.cv import *
|
||||
from opencv.highgui import *
|
||||
from random import random,randint
|
||||
|
||||
def draw_subdiv_point( img, fp, color ):
|
||||
cvCircle( img, cvPoint(cvRound(fp.x), cvRound(fp.y)), 3, color, CV_FILLED, 8, 0 );
|
||||
|
||||
|
||||
|
||||
def draw_subdiv_edge( img, edge, color ):
|
||||
org_pt = cvSubdiv2DEdgeOrg(edge);
|
||||
dst_pt = cvSubdiv2DEdgeDst(edge);
|
||||
|
||||
if org_pt and dst_pt :
|
||||
|
||||
org = org_pt.pt;
|
||||
dst = dst_pt.pt;
|
||||
|
||||
iorg = cvPoint( cvRound( org.x ), cvRound( org.y ));
|
||||
idst = cvPoint( cvRound( dst.x ), cvRound( dst.y ));
|
||||
|
||||
cvLine( img, iorg, idst, color, 1, CV_AA, 0 );
|
||||
|
||||
|
||||
def draw_subdiv( img, subdiv, delaunay_color, voronoi_color ):
|
||||
|
||||
total = subdiv.edges.total;
|
||||
elem_size = subdiv.edges.elem_size;
|
||||
|
||||
for edge in subdiv.edges:
|
||||
edge_rot = cvSubdiv2DRotateEdge( edge, 1 )
|
||||
|
||||
if( CV_IS_SET_ELEM( edge )):
|
||||
draw_subdiv_edge( img, edge_rot, voronoi_color );
|
||||
draw_subdiv_edge( img, edge, delaunay_color );
|
||||
|
||||
|
||||
def locate_point( subdiv, fp, img, active_color ):
|
||||
|
||||
[res, e0, p] = cvSubdiv2DLocate( subdiv, fp );
|
||||
|
||||
if e0:
|
||||
e = e0
|
||||
while True:
|
||||
draw_subdiv_edge( img, e, active_color );
|
||||
e = cvSubdiv2DGetEdge(e,CV_NEXT_AROUND_LEFT);
|
||||
if e == e0:
|
||||
break
|
||||
|
||||
draw_subdiv_point( img, fp, active_color );
|
||||
|
||||
|
||||
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 = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
|
||||
|
||||
buf = []
|
||||
|
||||
# gather points
|
||||
t = edge;
|
||||
for i in range(count):
|
||||
assert t>4
|
||||
pt = cvSubdiv2DEdgeOrg( t );
|
||||
if not pt:
|
||||
break;
|
||||
buf.append( cvPoint( cvRound(pt.pt.x), cvRound(pt.pt.y) ) );
|
||||
t = cvSubdiv2DGetEdge( t, CV_NEXT_AROUND_LEFT );
|
||||
|
||||
if( len(buf)==count ):
|
||||
pt = cvSubdiv2DEdgeDst( cvSubdiv2DRotateEdge( edge, 1 ));
|
||||
cvFillConvexPoly( img, buf, CV_RGB(randint(0,255),randint(0,255),randint(0,255)), CV_AA, 0 );
|
||||
cvPolyLine( img, [buf], 1, CV_RGB(0,0,0), 1, CV_AA, 0);
|
||||
draw_subdiv_point( img, pt.pt, CV_RGB(0,0,0));
|
||||
|
||||
def paint_voronoi( subdiv, img ):
|
||||
total = subdiv.edges.total;
|
||||
elem_size = subdiv.edges.elem_size;
|
||||
|
||||
cvCalcSubdivVoronoi2D( subdiv );
|
||||
|
||||
for edge in subdiv.edges:
|
||||
|
||||
if( CV_IS_SET_ELEM( edge )):
|
||||
# left
|
||||
draw_subdiv_facet( img, cvSubdiv2DRotateEdge( edge, 1 ));
|
||||
|
||||
# right
|
||||
draw_subdiv_facet( img, cvSubdiv2DRotateEdge( edge, 3 ));
|
||||
|
||||
if __name__ == '__main__':
|
||||
win = "source";
|
||||
rect = cvRect( 0, 0, 600, 600 );
|
||||
|
||||
active_facet_color = CV_RGB( 255, 0, 0 );
|
||||
delaunay_color = CV_RGB( 0,0,0);
|
||||
voronoi_color = CV_RGB(0, 180, 0);
|
||||
bkgnd_color = CV_RGB(255,255,255);
|
||||
|
||||
img = cvCreateImage( cvSize(rect.width,rect.height), 8, 3 );
|
||||
cvSet( img, bkgnd_color );
|
||||
|
||||
cvNamedWindow( win, 1 );
|
||||
|
||||
storage = cvCreateMemStorage(0);
|
||||
subdiv = cvCreateSubdivDelaunay2D( rect, storage );
|
||||
|
||||
print "Delaunay triangulation will be build now interactively."
|
||||
print "To stop the process, press any key\n";
|
||||
|
||||
for i in range(200):
|
||||
fp = cvPoint2D32f( random()*(rect.width-10)+5, random()*(rect.height-10)+5 )
|
||||
|
||||
locate_point( subdiv, fp, img, active_facet_color );
|
||||
cvShowImage( win, img );
|
||||
|
||||
if( cvWaitKey( 100 ) >= 0 ):
|
||||
break;
|
||||
|
||||
cvSubdivDelaunay2DInsert( subdiv, fp );
|
||||
cvCalcSubdivVoronoi2D( subdiv );
|
||||
cvSet( img, bkgnd_color );
|
||||
draw_subdiv( img, subdiv, delaunay_color, voronoi_color );
|
||||
cvShowImage( win, img );
|
||||
|
||||
if( cvWaitKey( 100 ) >= 0 ):
|
||||
break;
|
||||
|
||||
|
||||
cvSet( img, bkgnd_color );
|
||||
paint_voronoi( subdiv, img );
|
||||
cvShowImage( win, img );
|
||||
|
||||
cvWaitKey(0);
|
||||
|
||||
cvDestroyWindow( win );
|
Reference in New Issue
Block a user