Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / swig_python / minarea.py
diff --git a/samples/swig_python/minarea.py b/samples/swig_python/minarea.py
new file mode 100755 (executable)
index 0000000..19c2b53
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/python 
+
+from opencv.cv import *
+from opencv.highgui import *
+from random import randint
+
+def minarea_array(img, count):
+    pointMat = cvCreateMat( count, 1, CV_32SC2 )
+    for i in range(count):
+        pointMat[i] = cvPoint( randint(img.width/4, img.width*3/4),
+                               randint(img.height/4, img.height*3/4) )
+
+    box = cvMinAreaRect2( pointMat )
+    box_vtx = cvBoxPoints( box )
+    success, center, radius = cvMinEnclosingCircle( pointMat )
+    cvZero( img )
+    for i in range(count):
+        cvCircle( img, cvGet1D(pointMat,i), 2, CV_RGB( 255, 0, 0 ), CV_FILLED, CV_AA, 0 )
+
+    box_vtx = [cvPointFrom32f(box_vtx[0]),
+               cvPointFrom32f(box_vtx[1]),
+               cvPointFrom32f(box_vtx[2]),
+               cvPointFrom32f(box_vtx[3])]
+    cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, CV_AA, 0 )
+    cvPolyLine( img, [box_vtx], 1, CV_RGB(0,255,255), 1, CV_AA ) 
+    
+
+    
+def minarea_seq(img, count, storage):
+    ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC | CV_32SC2, sizeof_CvContour, sizeof_CvPoint, storage )
+    ptseq = CvSeq_CvPoint.cast( ptseq )
+    for i in range(count):
+        pt0 = cvPoint( randint(img.width/4, img.width*3/4),
+                       randint(img.height/4, img.height*3/4) )
+        cvSeqPush( ptseq, pt0 )
+    box = cvMinAreaRect2( ptseq )
+    box_vtx = cvBoxPoints( box )
+    success, center, radius = cvMinEnclosingCircle( ptseq )
+    cvZero( img )
+    for pt in ptseq: 
+        cvCircle( img, pt, 2, CV_RGB( 255, 0, 0 ), CV_FILLED, CV_AA, 0 )
+
+    box_vtx = [cvPointFrom32f(box_vtx[0]),
+               cvPointFrom32f(box_vtx[1]),
+               cvPointFrom32f(box_vtx[2]),
+               cvPointFrom32f(box_vtx[3])]
+    cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, CV_AA, 0 )
+    cvPolyLine( img, [box_vtx], 1, CV_RGB(0,255,255), 1, CV_AA ) 
+    cvClearMemStorage( storage )
+
+if __name__ == "__main__":
+    img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
+    storage = cvCreateMemStorage(0);
+
+    cvNamedWindow( "rect & circle", 1 );
+        
+    use_seq=True
+
+    while True: 
+        count = randint(1,100)
+        if use_seq:
+            minarea_seq(img, count, storage)
+        else:
+            minarea_array(img, count)
+
+        cvShowImage("rect & circle", img)
+        key = cvWaitKey()
+        if( key == '\x1b' ):
+            break;
+
+        use_seq = not use_seq