1. 程式人生 > >影象匹配演算法之brisk

影象匹配演算法之brisk

#include <cv.h>  
#include<opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/core/core.hpp> 
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/nonfree/features2d.hpp> 
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/nonfree/nonfree.hpp>  
#include <Windows.h>  
using namespace cv;
using namespace std;
int main()
{
//Load Image  
Mat c_src1 = imread("1-301.bmp");
Mat c_src2 = imread("1-200(1).bmp");
Mat src1 = imread("1-301.bmp", CV_LOAD_IMAGE_GRAYSCALE);
Mat src2 = imread("1-200(1).bmp", CV_LOAD_IMAGE_GRAYSCALE);
if (!src1.data || !src2.data)
{
cout << "Error reading images " << std::endl;
return -1;
}
//feature detect  
BRISK detector;
vector<KeyPoint> kp1, kp2;
double start = GetTickCount();
detector.detect(src1, kp1);
detector.detect(src2, kp2);
//cv::BRISK extractor;  
Mat des1, des2;//descriptor  
detector.compute(src1, kp1, des1);
detector.compute(src2, kp2, des2);
Mat res1, res2;
int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
drawKeypoints(c_src1, kp1, res1, Scalar::all(-1), drawmode);//畫出特徵點  
drawKeypoints(c_src2, kp2, res2, Scalar::all(-1), drawmode);
cout << "size of description of Img1: " << kp1.size() << endl;
cout << "size of description of Img2: " << kp2.size() << endl;
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(des1, des2, matches);
double end = GetTickCount();
cout << "耗時:" << (end - start) << "ms" << endl;
Mat img_match;
drawMatches(src1, kp1, src2, kp2, matches, img_match);
cout << "number of matched points: " << matches.size() << endl;
namedWindow("matches", WINDOW_NORMAL);
imshow("matches", img_match);
vector<Point2f> obj;
vector<Point2f> scene;
for (unsigned int i = 0; i < matches.size(); i++)
{
obj.push_back(kp1[matches[i].queryIdx].pt);
scene.push_back(kp2[matches[i].trainIdx].pt);
}
Mat H = findHomography(obj, scene, CV_RANSAC);
//-- Get the corners from the image_1 ( the object to be "detected" )  
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(src1.cols, 0);
obj_corners[2] = cvPoint(src1.cols,src1.rows); obj_corners[3] = cvPoint(0, src1.rows);
std::vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H);
//-- Draw lines between the corners (the mapped object in the scene - image_2 )  
line(img_match, scene_corners[0] + Point2f(src1.cols, 0), scene_corners[1] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(img_match, scene_corners[1] + Point2f(src1.cols, 0), scene_corners[2] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(img_match, scene_corners[2] + Point2f(src1.cols, 0), scene_corners[3] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(img_match, scene_corners[3] + Point2f(src1.cols, 0), scene_corners[0] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
//-- Show detected matches  
namedWindow("Good Matches & Object detection", WINDOW_NORMAL);
imshow("Good Matches & Object detection", img_match);
waitKey(0);
return 0;
}

相關推薦

影象匹配演算法brisk

#include <cv.h>   #include<opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>   #include <opencv2/core/core.hpp>  #include

影象匹配演算法研究surf演算法

今天碰巧和朋友討論這個,才想起來好久沒碰,都生疏了,趁著暑假還有點閒時,先寫寫再說。有錯誤的地方希望大家指正。 ? SURF (Speeded Up Robust Feature) is a robust local feature detector, firs

雙目立體視覺匹配演算法視差圖disparity計算——SAD演算法、SGBM演算法

一、SAD演算法 1.演算法原理         SAD(Sum of absolute differences)是一種影象匹配演算法。基本思想:差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演

逆向最大匹配演算法python實現

1.執行環境 python 3.6.4 2.思路 大致思路與正向相同,可參考我的上一篇部落格。 3.程式碼實現 import codecs #獲得分詞字典,儲存為字典形式 f1 = codecs.open('./corpus/WordList.txt', 'r', encodi

字串匹配演算法KMP演算法詳情

package demo; /* 字串匹配演算法 */ public class StringKMP { //找出從第一個字元開始 子串T在主串S的第一個位置 如果沒有則返回-1 public static int index(String S, String T)

影象處理演算法美顏

       和濾鏡一樣,美顏也是影象類app必不可少的功能之一,也有的app叫人像美容,主要包括美膚及美白等幾大功能。甚至有很多專門美顏的app,比如美顏相機什麼的,可見美顏功能需求量之大。很多女孩

影象增強演算法 限制對比度自適應直方圖均衡化演算法原理

一、自適應直方圖均衡化(Adaptive histgram equalization/AHE)       1.簡述        自適應直方圖均衡化(AHE)用來提升影象的對比度的一種計算機影象處理技術。和普通的直方圖均衡演算法不同,AHE演算法通過計算影象的區域性直方圖,然後重新分佈亮度來來改變影象對比

影象濾波演算法guide filter導向濾波

引導濾波演算法原理:影象引導濾波是一個線性移可變的濾波過程,包括引導影象I,輸入影象P,和輸出影象q。其中引導影象I是需要根據具體應用事先設定的,也可以直接取為輸入影象P。對於輸出影象中第i個畫素而言

字串匹配演算法KMP總結

字串匹配有很多方法,比如暴力,雜湊等等,還有一種廣為人知的演算法 − − −

字串匹配演算法:有限狀態自動機

什麼叫有限狀態自動機 先看一個圖: 上面這個圖描述的就叫一個有限狀態自動機,圖中兩個圓圈,也叫節點,用於表示狀態,從圖中可以看成,它有兩個狀態,分別叫0和1. 從每個節點出發,都會有若干條邊,當處於某個狀態時,如果輸入的字元跟該節點出發的某條邊的

筆記:影象分割演算法 Graph Cut

Graph Cut 與Grab Cut 都是基於圖論得分割方法。另外OpenCV實現了Grab Cut。Graph cuts 是一種有用和流行的能量優化演算法,在計算機視覺領域應用於前背景分割,立體視覺,摳圖。此類問題與圖的最小割問題相關聯。 首先

影象處理演算法瘦臉及放大眼睛

       現在很多影象美顏app,處理後不但使人物面板變得平滑、白皙,還會稍微瘦下臉、放大眼睛,給人眼前一亮的感覺。這其中涉及人臉檢測及特徵點提取演算法,一般提取68個特徵點就足夠了,同時也涉及影

多模字串匹配演算法AC自動機—原理與實現

簡介: 本文是博主自身對AC自動機的原理的一些理解和看法,主要以舉例的方式講解,同時又配以相應的圖片。程式碼實現部分也予以明確的註釋,希望給大家不一樣的感受。AC自動機主要用於多模式字串的匹配,本質上是KMP演算法的樹形擴充套件。這篇文章主要介紹AC自動機的工作原理,並在此

字串匹配演算法Sunday演算法

1 import java.util.HashMap; 2 import java.util.LinkedList; 3 import java.util.List; 4 import java.util.Map; 5 6 /** 7 * @author Scott 8

影象處理積分圖應用三(基於NCC快速相似度匹配演算法

影象處理之積分圖應用三(基於NCC快速相似度匹配演算法) 基於Normalized cross correlation(NCC)用來比較兩幅影象的相似程度已經是一個常見的影象處理手段。在工業生產環節檢測、監控領域對物件檢測與識別均有應用。NCC演算法可以有效降低光照對影象比較結果的影響。而

【OpenCV】SURF演算法視訊影象實時特徵點匹配

OpenCV原始碼中有關於SURF演算法的靜態影象特徵點匹配,就將其改進為動態視訊影象實時獲取特徵點並將其與目標影象進行特徵點匹配。 考慮到如果沒有獲取到連續幀影象,即有黑色影象被攝像頭捕捉到,此時FLANN演算法則失效,因為FLANN演算法是無法處理黑色影象的,它必須能採

正向最大匹配演算法實現python實現

1.python 版本:python 3.6.4 2.思路: s1.匯入分詞詞典,儲存為字典形式dic,匯入停用詞詞典stop_words,儲存為字典形式,需要分詞的文字檔案cutTest.txt,儲存為字串chars s2.遍歷分詞詞典,找出最長的詞,長度為max_chars s3

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:代價聚合(Cost Aggregation)

  由於代價計算步驟只考慮了局部的相關性,對噪聲非常敏感,無法直接用來計算最優視差,所以SGM演算法通過代價聚合步驟,使聚合後的代價值能夠更準確的反應畫素之間的相關性,如圖1所示。聚合後的新的代價值儲存在與匹配代價空間C同樣大小的聚合代價空間S中,且元素位置一一對應。 圖1:代價聚合

雙目立體匹配經典演算法Semi-Global Matching(SGM)概述:匹配代價計算Census變換(Census Transform,CT)

  基於互資訊的匹配代價計算由於需要初始視差值,所以需要通過分層迭代的方式得到較為準確的匹配代價值,而且概率分佈計算稍顯複雜,這導致代價計算的效率並不高。學者Zabih和Woodfill 1 提出的基於Census變換法也被廣泛用於匹配代價計算。Census變換是使用畫素鄰域內的區域性灰