• 大小: 55KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签: 椭圆  拟合  

资源简介

以C语言开发的最小二乘法椭圆拟合程序,精度非常高,欢迎使用

资源截图

代码片段和文件信息

#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 = argc == 2 ? argv[1] : (char*)“stuff.jpg“;
    
    // 读入图像,强制为灰度图像
    if( (image03 = cvLoadImage(filename 0)) == 0 )
        return -1;

    // Create the destination images
    image02 = cvCloneImage( image03 );
    image04 = cvCloneImage( image03 );

    // Create windows.
    cvNamedWindow(“Source“ 1);
    cvNamedWindow(“Result“ 1);

    // Show the image.
    cvShowImage(“Source“ image03);

    // Create toolbars. HighGUI use.
    cvCreateTrackbar( “Threshold“ “Result“ &slider_pos 255 process_image );

    process_image(0);

    // Wait for a key stroke; the same function arranges events processing                
    cvWaitKey(0);
    cvReleaseImage(&image02);
    cvReleaseImage(&image03);

    cvDestroyWindow(“Source“);
    cvDestroyWindow(“Result“);

    return 0;
}

// Define trackbar callback functon. This function find contours
// draw it and approximate it by ellipses.
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(00));
    
    // Clear images. IPL use.
    cvZero(image02);
    cvZero(image04);
    
    // 本循环绘制所有轮廓并用椭圆拟合.
    for(;cont;cont = cont->h_next)
    {   
        int i; // Indicator of cycle.
        int count = cont->total; // This is number point in contour
        CvPoint center;
        CvSize size;
        
        // Number point must be more than or equal to 6 (for cvFitEllipse_32f).        
        if( count < 6 )
            continue;
        
        // Alloc memory for contour point set.    
        PointArray = (CvPoint*)malloc( count*sizeof(CvPoint) );
        PointArray2D32f= (CvPoint2D32f*)malloc( count*sizeof(CvPoint2D32f) );
        
        // Alloc memory for ellipse data.
        box = (CvBox2D32f*)malloc(sizeof(CvBox2D32f));
        
        // Get contour point set.
        cvCvtSeqToArray(cont PointArray CV_WHOLE_SEQ);
        
        // Convert CvPoint set to CvBox2D32f set.
        for(i=0; i        {
            PointArray2D32f[i].x = (float)PointArray[i].x;
            PointArray2D32f[i].y = (float)PointArray[i].y;
        }
        
        //拟合当前轮廓.
        cvFitEllipse(PointArray2D32f count box);
        
        // 绘制当前轮廓.
        cvDrawContours(image04contCV_RGB(255255255)
CV_RGB(255255255)018cvPoint(00));
        
        // Convert ellipse data from float to integer representation.

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8238  2007-02-24 14:57  例5-17\circles.png

     文件       3647  2007-02-24 14:56  例5-17\fitellipse.c

     文件       4196  2007-03-07 20:41  例5-17\fitellipse.dsp

     文件        545  2007-03-07 20:41  例5-17\fitellipse.dsw

     文件        138  2007-02-24 15:10  例5-17\Makefile

     文件      44521  2007-03-07 22:17  例5-17\rice.png

     目录          0  2008-10-21 09:23  例5-17

     文件        440  2011-07-24 18:56  快捷方式 到 EPSnap.exe.lnk

----------- ---------  ---------- -----  ----

                61943                    9


评论

共有 条评论