【OpenCV學習】橢圓擬合


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

 

#include "cv.h"
#include "highgui.h"

int slider_pos=70;//閾值

IplImage *image02 =0,*image03 = 0,*image04 = 0;
void process_image(int h);

int main(int argc ,char **argv)
{
    const char *filename ="rice.png";
    if ((image03 = cvLoadImage(filename,0))==0)//讀入圖像為灰度圖像
    {
        return -1;
    }
    image02 = cvCloneImage(image03);
    image04 = cvCloneImage(image03);
    
    cvNamedWindow("Source",1);
    cvNamedWindow("Result",1);

    cvShowImage("Source",image03);

    cvCreateTrackbar("Threshold","Result",&slider_pos,255,process_image);

    process_image(0);

    cvWaitKey(0);
    cvSaveImage("1.jpg",image04);

    cvReleaseImage(&image02);
    cvReleaseImage(&image03);

    cvDestroyWindow("Source");
    cvDestroyWindow("Result");
    return 0;

}

//這個函數尋找出輪廓、用橢圓擬合畫出
void process_image(int h)
{
    CvMemStorage *stor;
    CvSeq *cont;
    CvBox2D32f *box;
    CvPoint *PointArray;
    CvPoint2D32f *PointArray2D32f;

    stor = cvCreateMemStorage(0);
    cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);

    cvThreshold(image03,image02,slider_pos,255,CV_THRESH_BINARY);

    cvFindContours(image02,stor,&cont,sizeof(CvContour),
        CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

    cvZero(image02);
    cvZero(image04);

    //繪制所有輪廓並用橢圓擬合
    for (;cont;cont = cont ->h_next)
    {
        int i;
        int count= cont->total;//輪廓個數
        CvPoint center;
        CvSize size;

        /*個數必須大於6,這是cvFitEllipse_32f的要求*/
        if (count<6)
        {
            continue;
        }
    
        //分配內存給點集
        PointArray = (CvPoint *)malloc(count*sizeof(CvPoint));
        PointArray2D32f = (CvPoint2D32f*)malloc(count*sizeof(CvPoint2D32f));
    
        //分配內存給橢圓數據
        box = (CvBox2D32f *)malloc(sizeof(CvBox2D32f));

        //得到點集(這個方法值得借鑒)
        cvCvtSeqToArray(cont,PointArray,CV_WHOLE_SEQ);
    
        //將CvPoint點集轉化為CvBox2D32f集合
        for (i=0;i<count;i++)
        {
            PointArray2D32f[i].x=(float)PointArray[i].x;
            PointArray2D32f[i].y=(float)PointArray[i].y;
        }

        //擬合當前輪廓
        cvFitEllipse(PointArray2D32f,count,box);

        //繪制當前輪廓
        cvDrawContours(image04,cont,CV_RGB(255,255,255),CV_RGB(255,255,255),
            0,1,8,cvPoint(0,0));

        //將橢圓數據從浮點轉化為整數表示
        center.x = cvRound(box->center.x);
        center.y = cvRound(box->center.y);
        size.width = cvRound(box->size.width*0.5);
        size.height = cvRound(box->size.height*0.5);
        box->angle = -box->angle;

        //畫橢圓
        cvEllipse(image04,center,size,box->angle,0,360,CV_RGB(0,0,255),1,CV_AA,0);

        free(PointArray);
        free(PointArray2D32f);
        free(box);
    }
    cvShowImage("Result",image04);
}

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


免責聲明!

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



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