#!/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