OpenCV的ORB特徵提取演算法

2021-08-30 13:24:08 字數 3124 閱讀 8103

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

看到opencv2.3.1裡面orb特徵提取演算法也在裡面了,套用給的surf特徵例子程式改為orb特徵一直提示錯誤,型別不匹配神馬的,由於沒有找到示例程式,只能自己找答案。

經過查詢發現:

描述符資料型別有是float的,比如說sift,surf描述符,還有是uchar的,比如說有orb,brief

對於float 匹配方式有:

flannbased

bruteforce>

bruteforce>

bruteforce>

對於uchar有:

bruteforce

bruteforce

bruteforcematcher< l2> matcher;//改動的地方

bruteforcematcher< l2> matcher;//改動的地方

完整**如下:

#include

#include

"opencv2/core/core.hpp"

#include

"opencv2/features2d/features2d.hpp"

#include

"opencv2/highgui/highgui.hpp"

#include

#include

using

namespace cv;  using

namespace

std;  int

main

()        orb orb;      vector

keypoints_1, keypoints_2;      mat descriptors_1, descriptors_2;        orb(img_1, mat(), keypoints_1, descriptors_1);      orb(img_2, mat(), keypoints_2, descriptors_2);            bruteforcematchermatcher;      vector

matches;      matcher.match(descriptors_1, descriptors_2, matches);        double max_dist = 0; double min_dist = 100;      //-- quick calculation of max and min distances between keypoints  

for( int i = 0; i < descriptors_1.rows; i++ )            printf("-- max dist : %f \n", max_dist );      printf("-- min dist : %f \n", min_dist );      //-- draw only "good" matches (i.e. whose distance is less than 0.6*max_dist )  

//-- ps.- radiusmatch can also be used here.  

std::vector

< dmatch > good_matches;      for( int i = 0; i < descriptors_1.rows; i++ )            }        mat img_matches;      drawmatches(img_1, keypoints_1, img_2, keypoints_2,          good_matches, img_matches, scalar::all(-1), scalar::all(-1),          vector

(), drawmatchesflags::not_draw_single_points);      imshow( "match", img_matches);      cvwaitkey();      return

0;  }

另外: surf sift 

/*sift sift;sift(img_1, mat(), keypoints_1, descriptors_1);sift(img_2, mat(), keypoints_2, descriptors_2);bruteforcematcher>  matcher;*/

/*surf surf;surf(img_1, mat(), keypoints_1);surf(img_2, mat(), keypoints_2);surfdescriptorextractor extrator;extrator.compute(img_1, keypoints_1, descriptors_1);extrator.compute(img_2, keypoints_2, descriptors_2);bruteforcematcher>  matcher;*/

效果:

另外乙個是尋找目標匹配

在右邊的場景圖裡面尋找左邊那幅圖的starbucks標誌

效果如下:

需要在之前的那個imshow之前加上如下**即可完成乙個簡單的功能展示:

// localize the object   

std::vector

obj;  std::vector

scene;    for (size_t i = 0; i < good_matches.size(); ++i)    mat h = findhomography( obj, scene, cv_ransac );    // get the corners from the image_1  

std::vector

obj_corners(4);  obj_corners[0] = cvpoint(0,0);  obj_corners[1] = cvpoint( img_1.cols, 0);  obj_corners[2] = cvpoint( img_1.cols, img_1.rows);  obj_corners[3] = cvpoint( 0, img_1.rows);  std::vector

給我老師的人工智慧教程打call!

ORB特徵提取

不明白的地方的一些整理 非極大值抑制主要是為了避免影象上得到的角點過於密集,主要過程是每個特徵點都會計算得到相應的響應得分,然後以當前畫素p為中心,取其鄰域 如3 3 判斷當前畫素p的響應是否為該鄰域內最大的,如果是則保留,否則,則抑制。非極大值抑制,排除不穩定的角點,採用強度響應函式 如何確定特徵...

ORB特徵提取1

orb特徵是在fast特徵點的基礎上再加上乙個旋轉量,本文以opencv自帶的fast函式求出特徵點keypoint,取特徵點附近一小塊區域b,b的大小是16 16,範圍是 u 8,v 8 u 7,v 7 可以定義該區域影象的矩 通過矩可以找到影象的質心 連線影象中心o與質心,可以得到方向向量oc,...

ORB特徵提取與匹配

特徵點的檢測 影象的特徵點可以簡單的理解為影象中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。orb採用fast features from accelerated segment test 演算法來檢測特徵點。這個定義基於特徵點周圍的影象灰度值,檢測候選特徵點周圍一圈的畫素值,...