Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / octave / minarea.m
diff --git a/samples/octave/minarea.m b/samples/octave/minarea.m
new file mode 100644 (file)
index 0000000..8394510
--- /dev/null
@@ -0,0 +1,85 @@
+#! /usr/bin/env octave
+
+cv;
+highgui;
+
+function ret = randint(a, b)
+  ret = int32(rand() * (b - a) + a);
+endfunction
+
+function minarea_array(img, count)
+  global cv;
+  global highgui;
+  pointMat = cvCreateMat( count, 1, cv.CV_32SC2 );
+  for i=0:count-1,
+    pointMat(i) = cvPoint( randint(img.width/4, img.width*3/4), randint(img.height/4, img.height*3/4) );
+  endfor
+
+  box = cvMinAreaRect2( pointMat );
+  box_vtx = cvBoxPoints( box );
+  [success, center, radius] = cvMinEnclosingCircle( pointMat );
+  cv.cvZero( img );
+  for i=0:count-1,
+    cvCircle( img, cvGet1D(pointMat,i), 2, CV_RGB( 255, 0, 0 ), \
+            cv.CV_FILLED, cv.CV_AA, 0 );
+  endfor
+
+  box_vtx = {cvPointFrom32f(box_vtx{1}), \
+             cvPointFrom32f(box_vtx{2}), \
+             cvPointFrom32f(box_vtx{3}), \
+             cvPointFrom32f(box_vtx{4})};
+  cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, cv.CV_AA, 0 );
+  cvPolyLine( img, {box_vtx}, 1, CV_RGB(0,255,255), 1, cv.CV_AA ) ;
+endfunction
+
+
+function minarea_seq(img, count, storage)
+  global cv;
+  global highgui;
+  ptseq = cvCreateSeq( bitor(cv.CV_SEQ_KIND_GENERIC, cv.CV_32SC2), cv.sizeof_CvContour, cv.sizeof_CvPoint, storage );
+  ptseq = cv.CvSeq_CvPoint.cast( ptseq );
+  for i=0:count-1,
+    pt0 = cvPoint( randint(img.width/4, img.width*3/4), randint(img.height/4, img.height*3/4) );
+    cvSeqPush( ptseq, pt0 );
+  endfor
+  box = cvMinAreaRect2( ptseq );
+  box_vtx = cvBoxPoints( box );
+  [success, center, radius] = cvMinEnclosingCircle( ptseq );
+  cv.cvZero( img );
+  for pt = CvSeq_map(ptseq),
+    pt = pt{1};
+    cvCircle( img, pt, 2, CV_RGB( 255, 0, 0 ), cv.CV_FILLED, cv.CV_AA, 0 );
+  endfor
+
+  box_vtx = {cvPointFrom32f(box_vtx{1}), \
+             cvPointFrom32f(box_vtx{2}), \
+             cvPointFrom32f(box_vtx{3}), \
+             cvPointFrom32f(box_vtx{4})};
+  cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, cv.CV_AA, 0 );
+  cvPolyLine( img, {box_vtx}, 1, CV_RGB(0,255,255), 1, cv.CV_AA );
+  cvClearMemStorage( storage );
+endfunction
+
+img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
+storage = cvCreateMemStorage(0);
+
+cvNamedWindow( "rect & circle", 1 );
+
+use_seq=false;
+
+while (true),
+  count = randint(1,100);
+  if (use_seq)
+    minarea_seq(img, count, storage);
+  else
+    minarea_array(img, count);
+  endif
+
+  cvShowImage("rect & circle", img);
+  key = cvWaitKey();
+  if( key == '\x1b' );
+    break;
+  endif
+
+  use_seq = !use_seq;
+endwhile