OpenCV函数cvFindContours
原圖
圖一
圖二
圖三
圖四
圖五
這是OpenCV的經(jīng)典一個(gè)例子:
?int levels = 3;CvSeq* contours = 0;?void on_trackbar(int pos){??? IplImage* cnt_img = cvCreateImage( cvSize(w,w), 8, 3 );??? CvSeq* _contours = contours;??? int _levels = levels - 3;??? if( _levels <= 0 ) // get to the nearest face to make it look more funny??????? _contours = _contours->h_next->h_next->h_next->h_next->h_next->h_next->h_next->v_next->h_next->h_next;//_contours = _contours->v_next;??? cvZero( cnt_img );??? cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);//, 3, CV_AA, cvPoint(0,0) );??? /*_levels:3,所有外輪廓及包含的內(nèi)輪廓及里面的內(nèi)輪廓2:所有外輪廓及包含的內(nèi)輪廓1:所有外輪廓0,第一個(gè)外輪廓-1:第一個(gè)外輪廓及包含的內(nèi)輪廓-2:第一個(gè)外輪廓及包含的內(nèi)輪廓及里面的內(nèi)輪廓?? _contours->h_next:同級的下一個(gè)輪廓_contours->v_next父級下的下層區(qū)域;*/cvShowImage( "contours", cnt_img );??? cvReleaseImage( &cnt_img );}?int main( int argc, char** argv ){??? int i, j;??? CvMemStorage* storage = cvCreateMemStorage(0);??? IplImage* img = cvCreateImage( cvSize(w,w), 8, 1 );???? cvZero( img );???? for( i=0; i < 6; i++ )??? {??????? int dx = (i%2)*250 - 30;//0%2=0;??????? int dy = (i/2)*150;??????? CvScalar white = cvRealScalar(255);??????? CvScalar black = cvRealScalar(0);???????? if( i == 0 )??????? {??????????? for( j = 0; j <= 10; j++ )??????????? {??????????????? double angle = (j+5)*CV_PI/21;??????????????? cvLine(img, cvPoint(cvRound(dx+100+j*10-80*cos(angle)),??????????????????? cvRound(dy+100-90*sin(angle))),??????????????????? cvPoint(cvRound(dx+100+j*10-30*cos(angle)),??????????????????? cvRound(dy+100-30*sin(angle))), white, 1, 8, 0);??????????? }??????? }???????? cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(100,70), 0, 0, 360, white, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(10,5), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+150, dy+150), cvSize(40,10), 0, 0, 360, black, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+27, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );??????? cvEllipse( img, cvPoint(dx+273, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );??? }???? cvNamedWindow( "image", 1 );??? cvShowImage( "image", img );???? cvFindContours( img, storage, &contours, sizeof(CvContour),??????????????????? 2, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );???? // comment this out if you do not want approximation??? contours = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );?//cvApproxPoly:???????????????????????????????????????????????? 逼近方法???? 精度 逼近曲線是否封閉??? cvNamedWindow( "contours", 1 );??? cvCreateTrackbar( "levels+3", "contours", &levels, 7, on_trackbar );???? on_trackbar(0);??? cvWaitKey(0);??? cvReleaseMemStorage( &storage );??? cvReleaseImage( &img );???? return 0;}主要還是理解下int mode=CV_RETR_LIST,int method=CV_CHAIN_APPROX_SIMPLE,CvPoint offset=cvPoint(0,0));
當(dāng)mode?為CV_RETR_CCOMP?只把圖像分為兩個(gè)層次,頂層和次層,一等級輪廓只匹配與其最接近??;
cvDrawContours?函數(shù)第5個(gè)參數(shù)為?max_level=0時(shí),笑臉圖像會(huì)顯示第一個(gè)找到的輪廓,左邊的白色耳朵一只;
max_level=1時(shí),所有白色區(qū)域的輪廓都會(huì)被顯示出來,因?yàn)樗麄兌紝儆诘燃?;
max_level=2時(shí);每個(gè)白色區(qū)域里面的黑色區(qū)域會(huì)被顯示出來,可能一個(gè)白色區(qū)域下面有多個(gè)黑色區(qū)域,但他們都是同級的;
這里你要注意的的是每個(gè)白色區(qū)域下的黑色區(qū)域,如臉下面有4個(gè)黑色區(qū)域,白色眼珠下有一個(gè)黑色區(qū)域,這個(gè)黑色區(qū)域與臉下的那三個(gè)區(qū)域時(shí)同級的,也就是說他不屬于臉的內(nèi)區(qū)域,他是白色眼珠的內(nèi)區(qū)域;
當(dāng)mode為???????CV_RETR_LIST?全部輪廓均為1級
???????????再分享一下我老師大神的人工智能教程吧。零基礎(chǔ)!通俗易懂!風(fēng)趣幽默!還帶黃段子!希望你也加入到我們?nèi)斯ぶ悄艿年?duì)伍中來!https://blog.csdn.net/jiangjunshow
總結(jié)
以上是生活随笔為你收集整理的OpenCV函数cvFindContours的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab产生年月日的时间序列,求助:
- 下一篇: 工业三防手持终端如何选