【OpenCV學習】輪廓檢測與重繪


作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

/**************提取模式. 
CV_RETR_EXTERNAL - 只提取最外層的輪廓 
CV_RETR_LIST - 提取所有輪廓,並且放置在 list 中 
CV_RETR_CCOMP - 提取所有輪廓,並且將其組織為兩層的 hierarchy: 頂層為連通域的外圍邊界,次層為洞的內層邊界。 
CV_RETR_TREE - 提取所有輪廓,並且重構嵌套輪廓的全部 hierarchy method 
*********************************/
#include "highgui.h"
#include "cv.h"
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int i=0;
    int mode=CV_RETR_EXTERNAL;//提取輪廓的模式
    int contours_num=0;//圖像中提取輪廓的數目
    CvMemStorage *storage=cvCreateMemStorage(0);//設置輪廓時需要的存儲容器
    CvSeq *contour =0;//設置存儲提取的序列指針
    IplImage *img=cvLoadImage("lena.jpg",0);
    cvThreshold(img,img,128,255,CV_THRESH_BINARY);//二值化
    IplImage *pContourImg = cvCreateImage(cvGetSize(img),
        IPL_DEPTH_8U,3);
    cvNamedWindow("windows",1);
    cvShowImage("windows",img);//顯示二值圖
    /*cvFindContours查找物體輪廓*/
    mode=CV_RETR_EXTERNAL;//提取物體最外層輪廓
    contours_num=cvFindContours(img,storage,&contour,
        sizeof(CvContour),mode,CV_CHAIN_APPROX_NONE);
    cout<<"檢測出的輪廓數目為:"<<contours_num<<" "<<endl;

    /*逐點將輪廓畫出*/
    CvSeqReader reader;//讀序列
    int count=0;
    if (contour!=0)
    {
        count=contour->total;
        cout<<count<<endl;
    }

    cvStartReadSeq(contour,&reader,0);
    CvPoint pt1;
    CvScalar color=CV_RGB(255,255,255);
    cvNamedWindow("contour",1);
    cvShowImage("contour",pContourImg);
    for (i=0;i<count;i++)//逐點繪圖法
    {
        CV_READ_SEQ_ELEM(pt1,reader);//讀出一個點
        cvCircle(pContourImg,pt1,1,color);//畫出一個點(就是一個以一個像素大小為半徑的圓)
        cvShowImage("contour",pContourImg);
        cvWaitKey(5);
    }
    cvWaitKey(0);

    cvReleaseImage(&img);
    cvReleaseImage(&pContourImg);
    cvReleaseMemStorage(&storage);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM