㈠ 圖像匹配演算法surf 的c#版(Matlab版也一樣)和opencv版中,參數形式不同,求對應關系啊
參考這個:http://kb.cnblogs.com/page/42226/
㈡ 如何使用opencv實現圖像匹配
在VSLAM中得常見方法是提取特徵點(SIFT ORB什麼的都可以),計算BoW,通過比較BoW來比較圖像的相似度。我們測試過用GoogleNet深度網路來提取特徵,再進行圖像相似度比較,效果比BoW要好一些。
㈢ opencv 圖像匹配問題
變形是隨機的嗎?可將模板也變形後在搜索?
㈣ opencv 中自帶的模板匹配演算法出處
方法如下:
使用OPENCV下SIFT庫做圖像匹配的常式
// opencv_empty_proj.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//從文件中讀入圖像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果讀入圖像失敗
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//顯示圖像
imshow("image before", img);
imshow("image2 before",img2);
//sift特徵檢測
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函數等待按鍵,按鍵盤任意鍵就返回
waitKey();
return 0;
}
㈤ 圖像匹配 Opencv 誰能跟我講解一下 CalcEMD2()函數,我看書上寫得比較專業,術語多,俺又看得不是很明。
這個函數沒用過,你最好還是看看示常式序吧。
兩個加權點集之間計算最小工作距離
float cvCalcEMD2( const CvArr* signature1, const CvArr* signature2, int distance_type,
CvDistanceFunction distance_func=NULL, const CvArr* cost_matrix=NULL,
CvArr* flow=NULL, float* lower_bound=NULL, void* userdata=NULL );
typedef float (*CvDistanceFunction)(const float* f1, const float* f2, void* userdata);
signature1
第一個簽名,大小為 size1×(dims+1) 的浮點數矩陣,每一行依次存儲點的權重和點的坐標。矩陣允許只有一列(即僅有權重),如果使用用戶自定義的代價矩陣。
signature2
第二個簽名,與 signature1 的格式一樣size2×(dims+1),盡管行數可以不同(列數要相同)。當一個額外的虛擬點加入 signature1 或 signature2 中的時候,權重也可不同。
distance_type
使用的准則, CV_DIST_L1, CV_DIST_L2, 和 CV_DIST_C 分別為標準的准則。 CV_DIST_USER 意味著使用用戶自定義函數 distance_func 或預先計算好的代價矩陣 cost_matrix 。
distance_func
用戶自定義的距離函數。用兩個點的坐標計算兩點之間的距離。
cost_matrix
自定義大小為 size1×size2 的代價矩陣。 cost_matrix 和 distance_func 兩者至少有一個必須為 NULL. 而且,如果使用代價函數,下邊界無法計算,因為它需要准則函數。
flow
產生的大小為 size1×size2 流矩陣(flow matrix): flowij 是從 signature1 的第 i 個點到 signature2 的第 j 個點的流(flow)。
lower_bound
可選的輸入/輸出參數:兩個簽名之間的距離下邊界,是兩個質心之間的距離。如果使用自定義代價矩陣,點集的所有權重不等,或者有簽名只包含權重(即該簽名矩陣只有單獨一列),則下邊界也許不會計算。用戶必須初始化 *lower_bound. 如果質心之間的距離大於獲等於 *lower_bound (這意味著簽名之間足夠遠), 函數則不計算 EMD. 任何情況下,函數返回時 *lower_bound 都被設置為計算出來的質心距離。因此如果用戶想同時計算質心距離和T EMD, *lower_bound 應該被設置為 0.
userdata
傳輸到自定義距離函數的可選數據指針
函數 cvCalcEMD2 計算兩個加權點集之間的移動距離或距離下界。在 [RubnerSept98] 中所描述的其中一個應用就是圖像提取得多維直方圖比較。 EMD 是一個使用某種單純形演算法(simplex algorithm)來解決的交通問題。其計算復雜度在最壞情況下是指數形式的,但是平均而言它的速度相當快。對實的准則,下邊界的計算可以更快(使用線性時間演算法),且它可用來粗略確定兩個點集是否足夠遠以至無法聯繫到同一個目標上
㈥ opencv關於像素點的圖像匹配演算法
首先,建議你將圖像中感興趣區域(比如上圖中的字母)取出來進行歸一化,然後在進行匹配率計算。這是因為周圍環境會對匹配率產生影響。
其次,建議你將匹配率演算法改成Hausdorff距離https://en.wikipedia.org/wiki/Hausdorff,這樣對圖像有些平移什麼的都不怎麼敏感了。
㈦ 如何使用opencv實現圖像匹配
如果僅有一張圖片的樣本的話,很難實現。
識別圖片的過程大概是:
提取特徵
訓練樣本,得到模型
使用模型判斷
如果題主想速成的話,還是去下現成代碼吧。。。
回答不容易,希望能幫到您,滿意請幫忙採納一下,謝謝 !
㈧ 使用OpenCV進行模板匹配(原圖-模板圖)
匹配演算法有很多,比如最簡單的對比原圖和模板圖的像素值。
但是這種方法稍微有一點旋轉和光照變化結果就會很差。
為了改進這個,有了SAD演算法。
然後SAD相似的SSD。
再然後是計算區域互相關性的NCC演算法。
以上三種演算法中,SAD演算法最簡單,因此當模板大小確定後,SAD演算法的速度最快。NCC演算法與SAD演算法相比要復雜得多。
至於演算法的過程,這三個演算法都是很好理解的演算法,我覺得還是自學比較好。
㈨ 如何使用opencv實現圖像匹配
OpenCV中有一些已經實現的匹配庫。一般是先尋找特徵點,然後匹配特徵點。
尋找特徵點一般有Harris(opencv中函數:cornerHarris),FAST(opencv中函數:FastFeatureDetector)等,匹配主要有SURF,SIFT等。可查閱OpenCV使用手冊學習調用,同時Opencv也有一些例子,可參考一下。
㈩ opencv 圖像旋轉後的匹配怎麼做
如果是基於特徵點對圖像進行匹配的話,建議選用帶有方向信息的特徵提取演算法,這樣每一個特徵點在提取特徵的時候都會計算出一個主方向,這個主方向與圖像的旋轉無關,而是與特徵點周圍像素的梯度相關,這樣在處理旋轉圖像時就不必再考慮圖像的旋轉方向了。