1. 程式人生 > >[OpenCV]直線擬合

[OpenCV]直線擬合

/* Takes an array of 3D points, type of distance (including user-defined
distance specified by callbacks, fills the array of four floats with line
parameters A, B, C, D, E, F, where (A, B, C) is the normalized direction vector,
(D, E, F) is the point that belongs to the line. */

static CvStatus
icvFitLine3D( CvPoint3D32f * points, int count, int dist,
              float _param, float reps, float aeps, float *line )
{
    double EPS = count*FLT_EPSILON;
    void (*calc_weights) (float *, int, float *) = 0;
    void (*calc_weights_param) (float *, int, float *, float) = 0;
    float *w;                   /* weights */
    float *r;                   /* square distances */
    int i, j, k;
    float _line[6]={0,0,0,0,0,0}, _lineprev[6]={0,0,0,0,0,0};
    float rdelta = reps != 0 ? reps : 1.0f;
    float adelta = aeps != 0 ? aeps : 0.01f;
    double min_err = DBL_MAX, err = 0;
    CvRNG rng = cvRNG(-1);

    switch (dist)
    {
    case CV_DIST_L2:
        return icvFitLine3D_wods( points, count, 0, line );

    case CV_DIST_L1:
        calc_weights = icvWeightL1;
        break;

    case CV_DIST_L12:
        calc_weights = icvWeightL12;
        break;

    case CV_DIST_FAIR:
        calc_weights_param = icvWeightFair;
        break;

    case CV_DIST_WELSCH:
        calc_weights_param = icvWeightWelsch;
        break;

    case CV_DIST_HUBER:
        calc_weights_param = icvWeightHuber;
        break;

    /*case CV_DIST_USER:
        _PFP.p = param;
        calc_weights = (void ( * )(float *, int, float *)) _PFP.fp;
        break;*/

    default:
        return CV_BADFACTOR_ERR;
    }

    w = (float *) cvAlloc( count * sizeof( float ));
    r = (float *) cvAlloc( count * sizeof( float ));

    for( k = 0; k < 20; k++ )
    {
        int first = 1;
        for( i = 0; i < count; i++ )
            w[i] = 0.f;

        for( i = 0; i < MIN(count,10); )
        {
            j = cvRandInt(&rng) % count;
            if( w[j] < FLT_EPSILON )
            {
                w[j] = 1.f;
                i++;
            }
        }

        icvFitLine3D_wods( points, count, w, _line );
        for( i = 0; i < 30; i++ )
        {
            double sum_w = 0;

            if( first )
            {
                first = 0;
            }
            else
            {
                double t = _line[0] * _lineprev[0] + _line[1] * _lineprev[1] + _line[2] * _lineprev[2];
                t = MAX(t,-1.);
                t = MIN(t,1.);
                if( fabs(acos(t)) < adelta )
                {
                    float x, y, z, ax, ay, az, dx, dy, dz, d;

                    x = _line[3] - _lineprev[3];
                    y = _line[4] - _lineprev[4];
                    z = _line[5] - _lineprev[5];
                    ax = _line[0] - _lineprev[0];
                    ay = _line[1] - _lineprev[1];
                    az = _line[2] - _lineprev[2];
                    dx = (float) fabs( y * az - z * ay );
                    dy = (float) fabs( z * ax - x * az );
                    dz = (float) fabs( x * ay - y * ax );

                    d = dx > dy ? (dx > dz ? dx : dz) : (dy > dz ? dy : dz);
                    if( d < rdelta )
                        break;
                }
            }
            /* calculate distances */
            if( icvCalcDist3D( points, count, _line, r ) < FLT_EPSILON*count )
                break;

            /* calculate weights */
            if( calc_weights )
                calc_weights( r, count, w );
            else
                calc_weights_param( r, count, w, _param );

            for( j = 0; j < count; j++ )
                sum_w += w[j];

            if( fabs(sum_w) > FLT_EPSILON )
            {
                sum_w = 1./sum_w;
                for( j = 0; j < count; j++ )
                    w[j] = (float)(w[j]*sum_w);
            }
            else
            {
                for( j = 0; j < count; j++ )
                    w[j] = 1.f;
            }

            /* save the line parameters */
            memcpy( _lineprev, _line, 6 * sizeof( float ));

            /* Run again... */
            icvFitLine3D_wods( points, count, w, _line );
        }

        if( err < min_err )
        {
            min_err = err;
            memcpy( line, _line, 6 * sizeof(line[0]));
            if( err < EPS )
                break;
        }
    }

    // Return...
    cvFree( &w );
    cvFree( &r );
    return CV_OK;
}

相關推薦

opencv直線cv::fitLine()

mali point mat double aep cas vector eps pes 通過2D或者2D點集擬合直線 void fitLine( InputArray points, OutputArray line, int distType,double param,

OpenCV直線

void fitLine( InputArray points, OutputArray line, int distType, double param, double reps, double aeps

[OpenCV]直線

/* Takes an array of 3D points, type of distance (including user-defined distance specified by callbacks, fills the array of four floats with line para

OpenCV 直線及應用

直線擬合顧名思義就是根據多個有限個數的點確定一條直線。依據為: 其中為第i個點到直線的距離,p(d)則為確定最小值的函式。而不同的p(d)對應著不同的直線擬合方法: OpenCV提供了7種(-1為使用者定義)直線擬合方法,如下: CV_DIST_U

OpenCV 學習(直線)

Hough 變換可以提取影象中的直線。但是提取的直線的精度不高。而很多場合下,我們需要精確的估計直線的引數,這時就需要進行直線擬合。 直線擬合的方法很多,比如一元線性迴歸就是一種最簡單的直線擬合方法。但是這種方法不適合用於提取影象中的直線。因為這種演算法假設每個資料點

opencv for python (18) 邊界矩形、最小外接圓、橢圓直線

函式cv2.boundingRect返回四個引數(x,y)為矩形左上角的座標,(w,h)是矩形的寬和高。 函式cv2.rectangle是繪製矩形函式 函式cv2.minAreaRect返回的是一個 Box2D 結構,其中包含 矩形左上角角點的座標(x,y

OpenCV曲線與圓

圖像分析 曲線擬合 OpenCV Python 圖像處理 OpenCV曲線擬合與圓擬合 使用OpenCV做圖像處理與分析的時候,經常會遇到需要進行曲線擬合與圓擬合的場景,很多OpenCV開發者對此卻是一籌莫展,其實OpenCV中是有現成的函數來實現圓擬合與直線擬合的,而且還會告訴你擬合的圓

8.霍夫變換:線條——介紹、引數模型、直線_1

目錄 介紹 引數模型 直線擬合 介紹 到目前為止,我們一直在做影象處理,你把一個影象 和 應用一些函式相加得到一個新的影象我標記為。 這很好,整個課程,實際上是整個職業生涯,數以萬計的PHD寫在影象處理上。 但這不是我們來這裡的原因。 我們來談談真正的計

N個點直線

轉載自:http://blog.sina.com.cn/s/blog_648868460100hevs.html 曲線擬合中最基本和最常用的是直線擬合。設x和y之間的函式關係為:         &

Ransac演算法--直線

Ransac演算法 1、演算法簡介 隨機抽樣一致演算法(RANdom SAmple Consensus,RANSAC)。它是一種迭代的方法,用來在一組包含離群的被觀測資料中估算出數學模型的引數。 RANSAC是一個非確定性演算法,在某種意義上說,它會產生一個在一定

opencv輪廓備忘錄】

#include <iostream> #include <vector> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <ope

RANSAC演算法做直線

# -*- coding: utf-8 -*- import numpy import scipy # use numpy if scipy unavailable import scipy.linalg # use numpy if scipy unavailable import pylab ## C

Opencv 曲線

void circleLeastFit(const std::vector<cv::Point2f> points, cv::Point2f &center, double

最小二乘法直線及其Matlab實現

 最小二乘法,通常用在我們已知數學模型,但是不知道模型引數的情況下,通過實測資料,計算數學模型,例如,在題目中,數學模型就是直線方程y=ax+b,但是不知道直線方程的a和b。     本來呢,我們只需要兩組(xi,yi),就可以解得a和b,但是由於實測資料都存在誤差,所以,

opencv利用hough概率變換得到直線後,利用DDA算法得到直線上的像素點坐標

步驟 else 每次 xunit pre 差值 一點 假設 color   圖片霍夫變換擬合得到直線後,怎樣獲得直線上的像素點坐標?   這是我今天在圖像處理學習中遇到的問題,霍夫變換采用的概率霍夫變換,所以擬合得到的直線信息其實是直線的兩個端點的坐標,這樣一個比較直接的思

曲線的最小二乘法(基於OpenCV實現)的,影象中離散點的直線

   今天使用擬合的最小二乘法,求出了給定的一組座標系上的點對最接近的直線的。  其具體理論如下:    在科學實驗資料處理中,往往要根據一組給定的實驗資料,求出自變數x與因變數y的函式關係,這是為待定引數,由於觀測資料總有誤差,且待定引數ai的數量比給定資料點的數量少(

opencv學習——最小二乘法直線

 最小二乘法擬合直線概念:最小二乘法多項式直線擬合,根據給定的點,求出它的函式y=f(x),當然求得準確的函式是不太可能的,但是我們能求出它的近似曲線y=φ(x)原理假設有點

OpenCV 最小二乘方法求取直線傾角

工業相機拍攝的影象中,由於攝像質量的限制,影象中的直線經過處理後,會表現出比較嚴重的鋸齒。在這種情況下求取直線的傾角(其實就是直線的斜率),如果是直接選取直線的開始點和結束點來計算,或是用opencv自帶的哈夫曼直線方法,都會引起較大的角度偏差,一般會達到好幾度。誤差這

最小二乘法直線--C++/Opencv

1.原理 在現實中經常遇到這樣的問題,一個函式並不是以某個數學表示式的形式給出,而是以一些自變數與因變數的對應表給出,老師講課的時候舉的個例子是犯罪人的身高和留下的腳印長,可以測出一些人的資料然後得到一張表,它反應的是一個函式,迴歸的意思就是將它還原成數學表示式,這個

Halcon直線

nbsp lec end save [] cross use color rect read_image(Image,'C:/Users/研發/Pictures/Saved Pictures/qq.bmp')dev_set_draw ('margin