久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

OpenCV函數(shù)cvFindContours

 年華似水匆匆 2013-10-16
  1. /************************************************************************/      
  2. /* 提取輪廓兩種方法對(duì)比及繪制輪廓'最大等級(jí)'分析                         */      
  3. /************************************************************************/      
  4. #include "stdafx.h"       
  5. #include "cv.h"       
  6. #include "highgui.h"       
  7.       
  8. int main()      
  9. {      
  10.     IplImage* img = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);      
  11.     IplImage* img_temp = cvCreateImage(cvGetSize(img), 8, 1);      
  12.   
  13.     cvThreshold(img, img, 128, 255, CV_THRESH_BINARY);      
  14.   
  15.     CvMemStorage* mem_storage = cvCreateMemStorage(0);      
  16.     CvSeq *first_contour = NULL, *c = NULL;      
  17.   
  18.     //////////////////////////////////////////////////////////////////////////       
  19.     // 1、       
  20.     cvNamedWindow("contour1");      
  21.     cvCopyImage(img, img_temp);      
  22.     double t = (double)cvGetTickCount();    
  23.     cvFindContours(img_temp, mem_storage, &first_contour);      
  24.     cvZero(img_temp);      
  25.     cvDrawContours(      
  26.         img_temp,       
  27.         first_contour,      
  28.         cvScalar(100),      
  29.         cvScalar(100),      
  30.         1      
  31.         );      
  32.     t = (double)cvGetTickCount() - t;     
  33.     cvShowImage("contour1", img_temp);      
  34.   
  35.     printf("run1 = %gms\n", t/(cvGetTickFrequency()*1000.));      
  36.   
  37.     cvClearMemStorage(mem_storage);      
  38.   
  39.     //////////////////////////////////////////////////////////////////////////       
  40.     // 2,、       
  41.     cvNamedWindow("contour2");      
  42.     cvCopyImage(img, img_temp);      
  43.     t = (double)cvGetTickCount();    
  44.     CvContourScanner scanner = cvStartFindContours(img_temp, mem_storage);      
  45.     while (cvFindNextContour(scanner));      
  46.     first_contour = cvEndFindContours(&scanner);      
  47.           
  48.     cvZero(img_temp);      
  49.     cvDrawContours(      
  50.         img_temp,       
  51.         first_contour,      
  52.         cvScalar(100),      
  53.         cvScalar(100),      
  54.         1      
  55.         );      
  56.     t = (double)cvGetTickCount() - t;     
  57.     cvShowImage("contour2", img_temp);      
  58.         
  59.     printf("run2 = %gms\n", t/(cvGetTickFrequency()*1000.));      
  60.           
  61.     cvClearMemStorage(mem_storage);      
  62.     cvReleaseImage(&img);      
  63.     cvReleaseImage(&img_temp);      
  64.       
  65.     cvWaitKey();      
  66.     
  67.     /************************************************************************/      
  68.     /* 經(jīng)測(cè)試 run1 = 16.1431ms run2 = 15.8677ms (參考)  
  69.        不過(guò)可以肯定這兩中算法時(shí)間復(fù)雜度是相同的                                     */      
  70.     /************************************************************************/      
  71.           
  72.     //////////////////////////////////////////////////////////////////////////       
  73.     // 上述兩種方法完成了對(duì)輪廓的提取,如想繪制輪廓都得配合cvDrawContours來(lái)使用       
  74.     // 而cvDrawContours 函數(shù)第5個(gè)參數(shù)為 max_level 經(jīng)查ICVL含義如下:       
  75.     //       
  76.     // 繪制輪廓的最大等級(jí),。如果等級(jí)為0,繪制單獨(dú)的輪廓,。如果為1,,繪制輪廓及在其后的相同的級(jí)別下輪廓。       
  77.     // 如果值為2,,所有的輪廓,。如果等級(jí)為2,繪制所有同級(jí)輪廓及所有低一級(jí)輪廓,,諸此種種,。如果值為負(fù)數(shù),       
  78.     // 函數(shù)不繪制同級(jí)輪廓,,但會(huì)升序繪制直到級(jí)別為abs(max_level)-1的子輪廓,。       
  79.     //       
  80.     // 相信好多讀者初次都無(wú)法理解等級(jí)的含義,而且測(cè)試時(shí)候輸入>=1 的整數(shù)效果幾乎一樣       
  81.     // 只有提取輪廓時(shí)候的提取模式設(shè)為 CV_RETR_CCOMP CV_RETR_TREE 時(shí)這個(gè)參數(shù)才有意義       
  82.     //       
  83.     // 經(jīng)查FindContours 函數(shù)里面這樣介紹提取模式(mode)的這兩個(gè)參數(shù):       
  84.     // CV_RETR_CCOMP - 提取所有輪廓,,并且將其組織為兩層的 hierarchy: 頂層為連通域的外圍邊界,,次層為洞的內(nèi)層邊界。        
  85.     // CV_RETR_TREE - 提取所有輪廓,,并且重構(gòu)嵌套輪廓的全部 hierarchy        
  86.     //        
  87.     // 下面用第一種方法進(jìn)行測(cè)試       
  88.       
  89.     cvNamedWindow("contour_test");      
  90.     cvNamedWindow("contour_raw");      
  91.     img = cvLoadImage("contour.jpg", CV_LOAD_IMAGE_GRAYSCALE);      
  92.     cvShowImage("contour_raw", img);      
  93.     cvThreshold(img, img, 128, 255, CV_THRESH_BINARY);      
  94.     img_temp = cvCloneImage(img);      
  95.     cvFindContours(      
  96.         img_temp,       
  97.         mem_storage,       
  98.         &first_contour,      
  99.         sizeof(CvContour),      
  100.         CV_RETR_CCOMP           //#1 需更改區(qū)域       
  101.         );      
  102.       
  103.     cvZero(img_temp);      
  104.     cvDrawContours(      
  105.         img_temp,       
  106.         first_contour,      
  107.         cvScalar(100),      
  108.         cvScalar(100),      
  109.         1                       //#2 需更改區(qū)域       
  110.         );      
  111.     cvShowImage("contour_test", img_temp);      
  112.     /************************************************************************/      
  113.     /* (1, 2) = (CV_RETR_CCOMP, 1)  如圖1   
  114.        (1, 2) = (CV_RETR_CCOMP, 2)  如圖2   
  115.        (1, 2) = (CV_RETR_TREE, 1)   如圖3   
  116.        (1, 2) = (CV_RETR_TREE, 2)   如圖4   
  117.        (1, 2) = (CV_RETR_TREE, 6)   如圖5   
  118.        經(jīng)分析CV_RETR_CCOMP 只把圖像分為兩個(gè)層次,頂層和次層,一等級(jí)輪廓只匹配與其最接近   
  119.        的內(nèi)側(cè)輪廓即2等級(jí)   
  120.        CV_RETR_TREE 則從輪廓外到內(nèi)按等級(jí)1 - n 全部分配           
  121.        CV_RETR_LIST 全部輪廓均為1級(jí)                        */      
  122.     /************************************************************************/      
  123.       
  124.     cvWaitKey();      
  125.     cvReleaseImage(&img);      
  126.     cvReleaseImage(&img_temp);      
  127.     cvReleaseMemStorage(&mem_storage);      
  128.     cvDestroyAllWindows();      
  129.     return 0;      
  130. }  

原圖

圖一

圖二


圖三

圖四

圖五

這是OpenCV的經(jīng)典一個(gè)例子:

  1. #include "cv.h"   
  2. #include "cxcore.h"   
  3. #include "highgui.h"   
  4. #include <math.h>   
  5. #endif   
  6.    
  7. #pragma   comment(lib,"cv.lib")     
  8. #pragma   comment(lib,"highgui.lib")     
  9. #pragma   comment(lib,"cxcore.lib")   
  10.   
  11. #define w 500   
  12. int levels = 3;  
  13. CvSeq* contours = 0;  
  14.    
  15. void on_trackbar(int pos)  
  16. {  
  17.     IplImage* cnt_img = cvCreateImage( cvSize(w,w), 8, 3 );  
  18.     CvSeq* _contours = contours;  
  19.     int _levels = levels - 3;  
  20.     if( _levels <= 0 ) // get to the nearest face to make it look more funny   
  21.         _contours = _contours->h_next->h_next->h_next->h_next->h_next->h_next->h_next->v_next->h_next->h_next;  
  22. //_contours = _contours->v_next;   
  23.     cvZero( cnt_img );  
  24.     cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);//, 3, CV_AA, cvPoint(0,0) );   
  25.     /*_levels: 
  26. 3,,所有外輪廓及包含的內(nèi)輪廓及里面的內(nèi)輪廓 
  27. 2:所有外輪廓及包含的內(nèi)輪廓 
  28. 1:所有外輪廓 
  29. 0,第一個(gè)外輪廓 
  30. -1:第一個(gè)外輪廓及包含的內(nèi)輪廓 
  31. -2:第一個(gè)外輪廓及包含的內(nèi)輪廓及里面的內(nèi)輪廓 
  32.  
  33.  
  34.    _contours->h_next:同級(jí)的下一個(gè)輪廓 
  35. _contours->v_next父級(jí)下的下層區(qū)域,; 
  36. */  
  37. cvShowImage( "contours", cnt_img );  
  38.     cvReleaseImage( &cnt_img );  
  39. }  
  40.    
  41. int main( int argc, char** argv )  
  42. {  
  43.     int i, j;  
  44.     CvMemStorage* storage = cvCreateMemStorage(0);  
  45.     IplImage* img = cvCreateImage( cvSize(w,w), 8, 1 );  
  46.    
  47.     cvZero( img );  
  48.    
  49.     for( i=0; i < 6; i++ )  
  50.     {  
  51.         int dx = (i%2)*250 - 30;//0%2=0;   
  52.         int dy = (i/2)*150;  
  53.         CvScalar white = cvRealScalar(255);  
  54.         CvScalar black = cvRealScalar(0);  
  55.    
  56.         if( i == 0 )  
  57.         {  
  58.             for( j = 0; j <= 10; j++ )  
  59.             {  
  60.                 double angle = (j+5)*CV_PI/21;  
  61.                 cvLine(img, cvPoint(cvRound(dx+100+j*10-80*cos(angle)),  
  62.                     cvRound(dy+100-90*sin(angle))),  
  63.                     cvPoint(cvRound(dx+100+j*10-30*cos(angle)),  
  64.                     cvRound(dy+100-30*sin(angle))), white, 1, 8, 0);  
  65.             }  
  66.         }  
  67.    
  68.         cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(100,70), 0, 0, 360, white, -1, 8, 0 );  
  69.         cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );  
  70.         cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );  
  71.         cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );  
  72.         cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );  
  73.         cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );  
  74.         cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );  
  75.         cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(10,5), 0, 0, 360, black, -1, 8, 0 );  
  76.         cvEllipse( img, cvPoint(dx+150, dy+150), cvSize(40,10), 0, 0, 360, black, -1, 8, 0 );  
  77.         cvEllipse( img, cvPoint(dx+27, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );  
  78.         cvEllipse( img, cvPoint(dx+273, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );  
  79.     }  
  80.    
  81.     cvNamedWindow( "image", 1 );  
  82.     cvShowImage( "image", img );  
  83.    
  84.     cvFindContours( img, storage, &contours, sizeof(CvContour),  
  85.                     2, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );  
  86.    
  87.     // comment this out if you do not want approximation   
  88.     contours = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );  
  89.  //cvApproxPoly:                                                 逼近方法     精度 逼近曲線是否封閉   
  90.   
  91.   
  92.     cvNamedWindow( "contours", 1 );  
  93.     cvCreateTrackbar( "levels+3""contours", &levels, 7, on_trackbar );  
  94.    
  95.     on_trackbar(0);  
  96.     cvWaitKey(0);  
  97.     cvReleaseMemStorage( &storage );  
  98.     cvReleaseImage( &img );  
  99.    
  100.     return 0;  
  101. }  

主要還是理解下int mode=CV_RETR_LIST,int method=CV_CHAIN_APPROX_SIMPLE,CvPoint offset=cvPoint(0,0));

當(dāng)mode 為CV_RETR_CCOMP 只把圖像分為兩個(gè)層次,頂層和次層,一等級(jí)輪廓只匹配與其最接近  ,;

cvDrawContours 函數(shù)第5個(gè)參數(shù)為 max_level=0時(shí),笑臉圖像會(huì)顯示第一個(gè)找到的輪廓,,左邊的白色耳朵一只,;

max_level=1時(shí),所有白色區(qū)域的輪廓都會(huì)被顯示出來(lái),,因?yàn)樗麄兌紝儆诘燃?jí)1,;

max_level=2時(shí);每個(gè)白色區(qū)域里面的黑色區(qū)域會(huì)被顯示出來(lái),,可能一個(gè)白色區(qū)域下面有多個(gè)黑色區(qū)域,,但他們都是同級(jí)的;

這里你要注意的的是每個(gè)白色區(qū)域下的黑色區(qū)域,如臉下面有4個(gè)黑色區(qū)域,,白色眼珠下有一個(gè)黑色區(qū)域,,這個(gè)黑色區(qū)域與臉下的那三個(gè)區(qū)域時(shí)同級(jí)的,也就是說(shuō)他不屬于臉的內(nèi)區(qū)域,,他是白色眼珠的內(nèi)區(qū)域,;

當(dāng)mode為       CV_RETR_LIST 全部輪廓均為1級(jí)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多