分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
看到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給我老師的人工智慧教程打call!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
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 演算法來檢測特徵點。這個定義基於特徵點周圍的影象灰度值,檢測候選特徵點周圍一圈的畫素值,...