X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=samples%2Foctave%2Fminarea.m;fp=samples%2Foctave%2Fminarea.m;h=839451044888141c47d1eda33250376dca9f1dcb;hb=e4c14cdbdf2fe805e79cd96ded236f57e7b89060;hp=0000000000000000000000000000000000000000;hpb=454138ff8a20f6edb9b65a910101403d8b520643;p=opencv diff --git a/samples/octave/minarea.m b/samples/octave/minarea.m new file mode 100644 index 0000000..8394510 --- /dev/null +++ b/samples/octave/minarea.m @@ -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