在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

特征點提取器ORBextractor詳解

3D視覺工坊 ? 來源:CSDN ? 作者:ncepu_Chen ? 2022-10-14 09:50 ? 次閱讀

各成員函數(shù)/變量

構(gòu)造函數(shù): ORBextractor()

FAST特征點和ORB描述子本身不具有尺度信息,ORBextractor通過構(gòu)建圖像金字塔來得到特征點尺度信息.將輸入圖片逐級縮放得到圖像金字塔,金字塔層級越高,圖片分辨率越低,ORB特征點越大.

6cc00086-4b4e-11ed-a3b6-dac502259ad0.jpg

構(gòu)造函數(shù)ORBextractor(int nfeatures, float scaleFactor, int nlevels, int iniThFAST, int minThFAST)的流程:

6cf55cfe-4b4e-11ed-a3b6-dac502259ad0.png

1.初始化圖像金字塔相關變量:

下面成員變量從配置文件TUM1.yaml中讀入:

6d0574a4-4b4e-11ed-a3b6-dac502259ad0.png ?

根據(jù)上述變量的值計算出下述成員變量:

6d1cf480-4b4e-11ed-a3b6-dac502259ad0.png

2.初始化用于計算描述子的pattern變量,pattern是用于計算描述子的256對坐標,其值寫死在源碼文件ORBextractor.cc里,在構(gòu)造函數(shù)里做類型轉(zhuǎn)換將其轉(zhuǎn)換為const cv::Point*變量.

static int bit_pattern_31_[256*4] ={
    8,-3, 9,5/*mean (0), correlation (0)*/,
    4,2, 7,-12/*mean (1.12461e-05), correlation (0.0437584)*/,
    -11,9, -8,2/*mean (3.37382e-05), correlation (0.0617409)*/,
    7,-12, 12,-13/*mean (5.62303e-05), correlation (0.0636977)*/,
    2,-13, 2,12/*mean (0.000134953), correlation (0.085099)*/,
    // 共256行...
}


const Point* pattern0 = (const Point*)bit_pattern_31_;
std::copy(pattern0, pattern0 + npoints, std::back_inserter(pattern));
3.計算一個半徑為16的圓的近似坐標

后面計算的是特征點主方向上的描述子,計算過程中要將特征點周圍像素旋轉(zhuǎn)到主方向上,因此計算一個半徑為16的圓的近似坐標,用于后面計算描述子時進行旋轉(zhuǎn)操作.

6d57742a-4b4e-11ed-a3b6-dac502259ad0.png


成員變量std::vector umax里存儲的實際上是逼近圓的第一象限內(nèi)1/4圓周上每個v坐標對應的u坐標.為保證嚴格對稱性,先計算下45°圓周上點的坐標,再根據(jù)對稱性補全上45°圓周上點的坐標.

int vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2.f) / 2 + 1); // 45°射線與圓周交點的縱坐標
int vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2.f) / 2);// 45°射線與圓周交點的縱坐標
// 先計算下半45度的umax
for (int v = 0; v <= vmax; ++v) {
umax[v] = cvRound(sqrt(15 * 15 - v * v));
}
// 根據(jù)對稱性補出上半45度的umax
for (int v = HALF_PATCH_SIZE, v0 = 0; v >= vmin; --v) {
    while (umax[v0] == umax[v0 + 1])
        ++v0;
    umax[v] = v0;
    ++v0;
}
構(gòu)建圖像金字塔: ComputePyramid()

根據(jù)上述變量的值計算出下述成員變量:

6d6d16e0-4b4e-11ed-a3b6-dac502259ad0.png

函數(shù)void ORBextractor::Mat image)逐層計算圖像金字塔,對于每層圖像進行以下兩步:

1)先進行圖片縮放,縮放到mvInvScaleFactor對應尺寸.

2)在圖像外補一圈厚度為19的padding(提取FAST特征點需要特征點周圍半徑為3的圓域,計算ORB描述子需要特征點周圍半徑為16的圓域).

下圖表示圖像金字塔每層結(jié)構(gòu):

1)深灰色為縮放后的原始圖像.

2)包含綠色邊界在內(nèi)的矩形用于提取FAST特征點.

3)包含淺灰色邊界在內(nèi)的整個矩形用于計算ORB描述子.

6d851e2a-4b4e-11ed-a3b6-dac502259ad0.png

void ORBextractor::Mat image) {
    for (int level = 0; level < nlevels; ++level) {
        // 計算縮放+補padding后該層圖像的尺寸
        float scale = mvInvScaleFactor[level];
        Size sz(cvRound((float)image.cols*scale), cvRound((float)image.rows*scale));
        Size wholeSize(sz.width + EDGE_THRESHOLD * 2, sz.height + EDGE_THRESHOLD * 2);
        Mat temp(wholeSize, image.type());
        
// 縮放圖像并復制到對應圖層并補邊
        mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));
        if( level != 0 ) {
            resize(mvImagePyramid[level-1], mvImagePyramid[level], sz, 0, 0, cv::INTER_LINEAR);
            copyMakeBorder(mvImagePyramid[level], temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, 
                           BORDER_REFLECT_101+BORDER_ISOLATED);            
        } else {
            copyMakeBorder(image, temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, 
                           BORDER_REFLECT_101);            
        }
    }
}
copyMakeBorder函數(shù)實現(xiàn)了復制和padding填充,其參數(shù)BORDER_REFLECT_101參數(shù)指定對padding進行鏡像填充.

6da16e7c-4b4e-11ed-a3b6-dac502259ad0.png

提取特征點并進行篩選: ComputeKeyPointsOctTree()

6dba9e4c-4b4e-11ed-a3b6-dac502259ad0.png

提取特征點最重要的就是力求特征點均勻地分布在圖像的所有部分,為實現(xiàn)這一目標,編程實現(xiàn)上使用了兩個技巧:

1)分CELL搜索特征點,若某CELL內(nèi)特征點響應值普遍較小的話就降低分數(shù)線再搜索一遍.

2)對得到的所有特征點進行八叉樹篩選,若某區(qū)域內(nèi)特征點數(shù)目過于密集,則只取其中響應值最大的那個.

6e717c66-4b4e-11ed-a3b6-dac502259ad0.png

CELL搜索的示意圖如下,每個CELL的大小約為3030,搜索到邊上,剩余尺寸不夠大的時候,最后一個CELL有多大就用多大的區(qū)域.

6e8f543e-4b4e-11ed-a3b6-dac502259ad0.png

需要注意的是相鄰的CELL之間會有6像素的重疊區(qū)域,因為提取FAST特征點需要計算特征點周圍半徑為3的圓周上的像素點信息,實際上產(chǎn)生特征點的區(qū)域比傳入的搜索區(qū)域小3像素.

6ea5c714-4b4e-11ed-a3b6-dac502259ad0.png

void ORBextractor::ComputeKeyPointsOctTree(vector >& allKeypoints){
    for (int level = 0; level < nlevels; ++level)
        // 計算圖像邊界
        const int minBorderX = EDGE_THRESHOLD-3;
        const int minBorderY = minBorderX;
        const int maxBorderX = mvImagePyramid[level].cols-EDGE_THRESHOLD+3;
        const int maxBorderY = mvImagePyramid[level].rows-EDGE_THRESHOLD+3;
        const float width = (maxBorderX-minBorderX);
        const float height = (maxBorderY-minBorderY);
        const int nCols = width/W;// 每一列有多少cell
        const int nRows = height/W;// 每一行有多少cell
        const int wCell = ceil(width/nCols);// 每個cell的寬度
        const int hCell = ceil(height/nRows);// 每個cell的高度




        // 存儲需要進行平均分配的特征點
        vector vToDistributeKeys;




    // step1. 遍歷每行和每列,依次分別用高低閾值搜索FAST特征點
        for(int i=0; i vKeysCell;




                // 先用高閾值搜索FAST特征點
                FAST(mvImagePyramid[level].rowRange(iniY,maxY).colRange(iniX,maxX),vKeysCell, iniThFAST, true);
                // 高閾值搜索不到的話,就用低閾值搜索FAST特征點
                if(vKeysCell.empty()) {
                    FAST(mvImagePyramid[level].rowRange(iniY,maxY).colRange(iniX,maxX),vKeysCell, minThFAST, true);
                }
// 把 vKeysCell 中提取到的特征點全添加到 容器vToDistributeKeys 中
                for(KeyPoint point :vKeysCell) {
                    point.pt.x+=j*wCell;
                    point.pt.y+=i*hCell;
                    vToDistributeKeys.push_back(point);
                }
            }
        }




    // step2. 對提取到的特征點進行八叉樹篩選,見 DistributeOctTree() 函數(shù)
        keypoints = DistributeOctTree(vToDistributeKeys, minBorderX, maxBorderX, minBorderY, maxBorderY, mnFeaturesPerLevel[level], level);
    }
// 計算每個特征點的方向
    for (int level = 0; level < nlevels; ++level)
        computeOrientation(mvImagePyramid[level], allKeypoints[level], umax);
}
}
八叉樹篩選特征點: DistributeOctTree()

函數(shù)DistributeOctTree()進行八叉樹篩選(非極大值抑制),不斷將存在特征點的圖像區(qū)域進行4等分,直到分出了足夠多的分區(qū),每個分區(qū)內(nèi)只保留響應值最大的特征點. 其代碼實現(xiàn)比較瑣碎,程序里還定義了一個ExtractorNode類用于進行八叉樹分配,知道原理就行,不看代碼.

6edf87ba-4b4e-11ed-a3b6-dac502259ad0.jpg


計算特征點方向computeOrientation()

函數(shù)computeOrientation()計算每個特征點的方向: 使用特征點周圍半徑19大小的圓的重心方向作為特征點方向.

6f00346a-4b4e-11ed-a3b6-dac502259ad0.png

static void computeOrientation(const Mat& image, vector& keypoints, const vector& umax)
{
for (vector::iterator keypoint : keypoints) {
// 調(diào)用IC_Angle 函數(shù)計算這個特征點的方向
        keypoint->angle = IC_Angle(image, keypoint->pt, umax);
    }
}




static float IC_Angle(const Mat& image, Point2f pt,  const vector & u_max)
{
int m_01 = 0, m_10 = 0;// 重心方向
    const uchar* center = &image.at (cvRound(pt.y), cvRound(pt.x));
    for (int u = -HALF_PATCH_SIZE; u <= HALF_PATCH_SIZE; ++u)
    m_10 += u * center[u];
    int step = (int)image.step1();
for (int v = 1; v <= HALF_PATCH_SIZE; ++v) {
        int v_sum = 0;
  int d = u_max[v];
    for (int u = -d; u <= d; ++u) {
            int val_plus = center[u + v*step], val_minus = center[u - v*step];
            v_sum += (val_plus - val_minus);
            m_10 += u * (val_plus + val_minus);
        }
        m_01 += v * v_sum;
    }




    // 為了加快速度使用了fastAtan2()函數(shù),輸出為[0,360)角度,精度為0.3°
    return fastAtan2((float)m_01, (float)m_10);
}
計算特征點描述子computeOrbDescriptor()

計算BRIEF描述子的核心步驟是在特征點周圍半徑為16的圓域內(nèi)選取256對點對,每個點對內(nèi)比較得到1位,共得到256位的描述子,為保計算的一致性,工程上使用特定設計的點對pattern,在程序里被硬編碼為成員變量了.

6f0bbdb2-4b4e-11ed-a3b6-dac502259ad0.png

在computeOrientation()中我們求出了每個特征點的主方向,在計算描述子時,應該將特征點周圍像素旋轉(zhuǎn)到主方向上來計算;為了編程方便,實踐上對pattern進行旋轉(zhuǎn).

6f2b262a-4b4e-11ed-a3b6-dac502259ad0.png

static void computeOrbDescriptor(const KeyPoint& kpt, const Mat& img, const Point* pattern, uchar* desc) {




    float angle = (float)kpt.angle*factorPI;
float a = (float)cos(angle), b = (float)sin(angle);




const uchar* center = &img.at(cvRound(kpt.pt.y), cvRound(kpt.pt.x));
const int step = (int)img.step;




    // 旋轉(zhuǎn)公式
// x'= xcos(θ) - ysin(θ)
    // y'= xsin(θ) + ycos(θ)
    #define GET_VALUE(idx) 
    center[cvRound(pattern[idx].x*b + pattern[idx].y*a)*step + cvRound(pattern[idx].x*a - pattern[idx].y*b)]        
    for (int i = 0; i < 32; ++i, pattern += 16) {
        int t0, t1, val;
        t0 = GET_VALUE(0); t1 = GET_VALUE(1);
        val = t0 < t1;// 描述子本字節(jié)的bit0
        t0 = GET_VALUE(2); t1 = GET_VALUE(3);
        val |= (t0 < t1) << 1;// 描述子本字節(jié)的bit1
        t0 = GET_VALUE(4); t1 = GET_VALUE(5);
        val |= (t0 < t1) << 2;// 描述子本字節(jié)的bit2
        t0 = GET_VALUE(6); t1 = GET_VALUE(7);
        val |= (t0 < t1) << 3;// 描述子本字節(jié)的bit3
        t0 = GET_VALUE(8); t1 = GET_VALUE(9);
        val |= (t0 < t1) << 4;// 描述子本字節(jié)的bit4
        t0 = GET_VALUE(10); t1 = GET_VALUE(11);
        val |= (t0 < t1) << 5;// 描述子本字節(jié)的bit5
        t0 = GET_VALUE(12); t1 = GET_VALUE(13);
        val |= (t0 < t1) << 6;// 描述子本字節(jié)的bit6
        t0 = GET_VALUE(14); t1 = GET_VALUE(15);
        val |= (t0 < t1) << 7;// 描述子本字節(jié)的bit7




        //保存當前比較的出來的描述子的這個字節(jié)
        desc[i] = (uchar)val;
    }
}
ORBextractor類的用途

6f4f0158-4b4e-11ed-a3b6-dac502259ad0.png


ORBextractor被用于Tracking線程對輸入圖像預處理的第一步. ORBextractor類提取特征點的主函數(shù)void operator()() 這個函數(shù)重載了()運算符,使得其他類可以將ORBextractor類型變量當作函數(shù)來使用. 該函數(shù)是ORBextractor的主函數(shù),內(nèi)部依次調(diào)用了上面提到的各過程.

6f73b1c4-4b4e-11ed-a3b6-dac502259ad0.png

void ORBextractor::operator()(InputArray _image, InputArray _mask, vector& _keypoints, OutputArray _descriptors) { 
// step1. 檢查圖像有效性
    if(_image.empty())
        return;
Mat image = _image.getMat();
assert(image.type() == CV_8UC1 );




    // step2. 構(gòu)建圖像金字塔
    ComputePyramid(image);




    // step3. 計算特征點并進行八叉樹篩選
    vector > allKeypoints; 
    ComputeKeyPointsOctTree(allKeypoints);




    // step4. 遍歷每一層圖像,計算描述子
    int offset = 0;
for (int level = 0; level < nlevels; ++level) {
        Mat workingMat = mvImagePyramid[level].clone();
        // 計算描述子之前先進行一次高斯模糊
        GaussianBlur(workingMat, workingMat, Size(7, 7), 2, 2, BORDER_REFLECT_101);
        computeDescriptors(workingMat, allKeypoints[level], descriptors.rowRange(offset, offset + allKeypoints[level].size());, pattern);
        offset += allKeypoints[level].size();
    }
}
這個重載()運算符的用法被用在Frame類的ExtractORB()函數(shù)中了,這也是ORBextractor類在整個項目中唯一被調(diào)用的地方.
// 函數(shù)中`mpORBextractorLeft`和`mpORBextractorRight`都是`ORBextractor`對象
void Frame::ExtractORB(int flag, const cv::Mat &im) {
    if(flag==0)
        (*mpORBextractorLeft)(im, cv::Mat(), mvKeys, mDescriptors);
    else
        (*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}
ORBextractor類與其它類間的關系

Frame類中與ORBextractor有關的成員變量和成員函數(shù)

6f86d786-4b4e-11ed-a3b6-dac502259ad0.png

// Frame類的兩個ORBextractor是在調(diào)用構(gòu)造函數(shù)時傳入的,構(gòu)造函數(shù)中調(diào)用ExtractORB()提取特征點
Frame::Frame(ORBextractor *extractorLeft, ORBextractor *extractorRight) 
    : mpORBextractorLeft(extractorLeft), mpORBextractorRight(extractorRight) {




        // ...




        // 提取ORB特征點
        thread threadLeft(&Frame::ExtractORB, this, 0, imLeft);
        thread threadRight(&Frame::ExtractORB, this, 1, imRight);
        threadLeft.join();
        threadRight.join();




        // ...       
    }




// 提取特征點
void Frame::ExtractORB(int flag, const cv::Mat &im) {
    if (flag == 0)
        (*mpORBextractorLeft)(im, cv::Mat(), mvKeys, mDescriptors);
    else
        (*mpORBextractorRight)(im, cv::Mat(), mvKeysRight, mDescriptorsRight);
}
Frame類的兩個ORBextractor指針指向的變量是Tracking類的構(gòu)造函數(shù)中創(chuàng)建的
// Tracking構(gòu)造函數(shù)
Tracking::Tracking() {
    // ...
    
    // 創(chuàng)建兩個ORB特征點提取器
    mpORBextractorLeft = new ORBextractor(nFeatures, fScaleFactor, nLevels, fIniThFAST, fMinThFAST);
    if (sensor == System::STEREO)
        mpORBextractorRight = new ORBextractor(nFeatures, fScaleFactor, nLevels, fIniThFAST, fMinThFAST);




  // ...
}




// Tracking線程每收到一幀輸入圖片,就創(chuàng)建一個Frame對象,創(chuàng)建Frame對象時將提取器mpORBextractorLeft和mpORBextractorRight給構(gòu)造函數(shù)
cv::Mat Tracking::GrabImageStereo(const cv::Mat &imRectLeft, const cv::Mat &imRectRight, const double &timestamp) {
    // ...
    
    // 創(chuàng)建Frame對象
    mCurrentFrame = Frame(mImGray, imGrayRight, timestamp, mpORBextractorLeft, mpORBextractorRight);




    // ...
}
由上述代碼分析可知,每次完成ORB特征點提取之后,圖像金字塔信息就作廢了,下一幀圖像到來時調(diào)用ComputePyramid()函數(shù)會覆蓋掉本幀圖像的圖像金字塔信息;但從金字塔中提取的圖像特征點的信息會被保存在Frame對象中.所以ORB-SLAM2是稀疏重建,對每幀圖像只保留最多nfeatures個特征點(及其對應的地圖點).

6fbacdd4-4b4e-11ed-a3b6-dac502259ad0.png




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SLAM
    +關注

    關注

    24

    文章

    437

    瀏覽量

    32376
  • fast
    +關注

    關注

    0

    文章

    34

    瀏覽量

    11389
  • 提取器
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8179
  • orb
    orb
    +關注

    關注

    0

    文章

    21

    瀏覽量

    10022

原文標題:ORB-SLAM2代碼詳解:特征點提取器ORBextractor

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何提取顏色特征

    計算機視覺的特征提取算法研究至關重要。在一些算法中,一個高復雜度特征提取可能能夠解決問題(進行目標檢測等目的),但這將以處理更多數(shù)據(jù),需要更高的處理效果為代價。而顏色特征無需進行大量
    發(fā)表于 10-12 06:55

    基于已知特征項和環(huán)境相關量的特征提取算法

    在現(xiàn)有基于已知特征特征提取算法的基礎上,提出一種基于已知特征項和環(huán)境相關量的特征提取算法。該算法通過已知特征項搜索頻繁項集,提高了
    發(fā)表于 04-18 09:37 ?17次下載

    改進的特征匹配算法

    特征匹配是計算機視覺中的關鍵步驟,在很多領域中都有著的重要應用。通過對當前圖像特征匹配方法的研究,提取一種基于
    發(fā)表于 05-19 17:20 ?0次下載
    改進的<b class='flag-5'>特征</b><b class='flag-5'>點</b>匹配算法

    紋理特征提取方法

    文中主要介紹了基于分形維數(shù)提取法、小波提取法、Gabor濾波提取法、灰度共生矩陣提取法等紋理特征提取
    發(fā)表于 02-22 11:11 ?10次下載
    紋理<b class='flag-5'>特征提取</b>方法

    人臉特征的定位和提取

    人臉特征的定位和提取
    發(fā)表于 02-08 00:38 ?17次下載

    舌診圖像刺和瘀的識別與提取

    檢測算法檢測斑點,并提取出斑點數(shù)量、大小和分布等特征值生成特征向量,再使用SVM進行刺(瘀)舌象識別。
    發(fā)表于 11-20 11:34 ?4次下載
    舌診圖像<b class='flag-5'>點</b>刺和瘀<b class='flag-5'>點</b>的識別與<b class='flag-5'>提取</b>

    一種去冗余的SIFT特征提取方法

    的SIFT特征提取算法。首先提取出SIFT特征,然后根據(jù)特征周邊梯度情況,判斷
    發(fā)表于 12-01 15:08 ?0次下載
    一種去冗余的SIFT<b class='flag-5'>特征提取</b>方法

    基于HTM架構(gòu)的時空特征提取方法

    針對人體動作識別中時空特征提取問題,提出一種基于層次時間記憶( HTM)架構(gòu)的深度學習模型,用來提取圖像幀的時空特征。將圖像幀構(gòu)建成樹型節(jié)點層次結(jié)構(gòu),在每一層中,通過歐氏距離分組來提取
    發(fā)表于 01-17 17:27 ?0次下載
    基于HTM架構(gòu)的時空<b class='flag-5'>特征提取</b>方法

    散亂云數(shù)據(jù)特征信息提取算法

    特征提取不僅可以更好地刻畫三維模型特征,并且其在模型重建、云分割、對稱性檢測以及云配準等。方面起到一定的作用。特征提取主要包括對
    發(fā)表于 01-30 16:35 ?0次下載
    散亂<b class='flag-5'>點</b>云數(shù)據(jù)<b class='flag-5'>特征</b>信息<b class='flag-5'>提取</b>算法

    機器學習之特征提取 VS 特征選擇

    機器學習中特征選擇和特征提取區(qū)別 demi 在 周四, 06/11/2020 - 16:08 提交 1. 特征提取 V.S 特征選擇 特征提取
    的頭像 發(fā)表于 09-14 16:23 ?4385次閱讀
    機器學習之<b class='flag-5'>特征提取</b> VS <b class='flag-5'>特征</b>選擇

    新型著裝人體多特征提取和尺寸測量算法

    傳統(tǒng)非接觸式人體尺寸測量中的關鍵特征是根據(jù)人體各部位的比例關系直接提取,該方法對人體體型和著裝要求嚴格,導致在多數(shù)情形下獲取的關鍵特征
    發(fā)表于 03-16 09:41 ?16次下載
    新型著裝人體多<b class='flag-5'>特征提取</b>和尺寸測量算法

    基于自編碼特征的語音聲學綜合特征提取

    信噪比衡量)很低。在不影響可懂度的情況下,為了提高語音増強后語音質(zhì)量,提出了一種基于自編碼特征的綜合特征。首先利用自編碼提取自編碼特征,然
    發(fā)表于 05-19 16:33 ?27次下載

    計算機視覺中不同的特征提取方法對比

    特征提取是計算機視覺中的一個重要主題。不論是SLAM、SFM、三維重建等重要應用的底層都是建立在特征跨圖像可靠地提取和匹配之上。特征提取
    的頭像 發(fā)表于 07-11 10:28 ?4151次閱讀

    面向SLAM魯棒應用提出了基于RGB特征提取算法

    視覺SLAM(Simultaneous Localization And Mapping)的關鍵是建立圖像間魯棒的特征匹配關系,其決定著攝像機運動參數(shù)的求解精度和目標點三維世界坐標重建精度[1],而影響匹配效果的重要因素是特征
    的頭像 發(fā)表于 09-23 10:31 ?1503次閱讀

    如何提取、匹配圖像特征

    我們習慣從圖像中選取比較有代表性的,然后,在此基礎上,討論相機位姿估計問題,以及這些的定位問題。 在經(jīng)典 SLAM 模型中,把它們稱為路標,而在視覺 SLAM 中,路標則是指圖像特征(Features)。
    的頭像 發(fā)表于 04-19 11:41 ?1062次閱讀
    主站蜘蛛池模板: 午夜三级国产精品理论三级 | 四虎最新紧急入口4hu | 国产色婷婷精品综合在线手机播放 | 欧美成人鲁丝片在线观看 | 欧美成人一区亚洲一区 | 成在线人视频免费视频 | 亚洲成人免费在线 | 深爱五月激情五月 | 午夜久久网 | 午夜精品久久久久久毛片 | 夜夜夜夜曰天天天天拍国产 | 国产一卡二卡3卡4卡四卡在线 | 天天色综合2 | 在线观看永久免费视频网站 | 精品欧美小视频在线观看 | 五月天综合在线 | 丝袜美女被c | 欧美12一13高清视频 | 久久中文字幕综合婷婷 | 免费一级毛片在线播放不收费 | 久久久久久久久综合 | 国产一级特黄的片子 | 一本到卡二卡三卡免费高 | 五月婷婷六月丁香激情 | 国模精品视频一区二区三区 | 天天操视频 夜夜 | 久久国产乱子伦精品免 | 欧美 亚洲 国产 丝袜 在线 | 午夜老司机永久免费看片 | 欧美线人一区二区三区 | 亚洲综合色丁香婷婷六月图片 | 国产v69 | 四虎影院海外永久 | 亚洲一区视频在线 | 夜夜艹 | hd性欧美 | 午夜精品久久久久久影视riav | 欧美日本一区二区三区道 | bt天堂网在线| 日韩亚洲欧洲在线com91tv | 日本一道高清不卡免费 |