国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配

這篇具有很好參考價(jià)值的文章主要介紹了Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

關(guān)于特征檢測(cè)和匹配的具體原理會(huì)在后續(xù)的文章中具體講解,本文主要介紹Opencv實(shí)現(xiàn)的簡(jiǎn)單過程:
第一步:定義特征檢測(cè)器(SIFT,SURF,ORB等)。

第二步:對(duì)圖像中特征點(diǎn)進(jìn)行檢測(cè),并將特征點(diǎn)存儲(chǔ)在Keypoints中。

第三步:提取特征點(diǎn)的描述信息。

第四步:定義特征匹配器(特征匹配的方法主要有兩種分別為暴力匹配BFmatch和FlannBased)。

第五步:過濾掉較差的匹配點(diǎn)位(一般根據(jù)臨近兩點(diǎn)的距離進(jìn)行過濾)

主要是根據(jù)DMatch中的distance進(jìn)行過濾,對(duì)于distance可以抽象理解為匹配的分值,distance越小說明檢測(cè)點(diǎn)的相似度越高,效果越好。

第六步:對(duì)匹配的特征點(diǎn)顯示。

代碼1(未濾波,只限制篩選點(diǎn)數(shù)為20)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>


using namespace cv;  //包含cv命名空間
using namespace std;
using namespace xfeatures2d;


int main() {

	system("color 2E");
	//載入圖片
	Mat src1 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\4.jpg", 1);

	//顯示原圖
	imshow("原圖1",src1);
	imshow("原圖2", src2);

	//定義變量
	vector<KeyPoint> keypoints1, keypoints2;//定義檢測(cè)的特征點(diǎn)存儲(chǔ)容器
	Mat descriptors1,descriptors2;//定義特征點(diǎn)描述信息為Mat類型
	Mat result_img;//匹配結(jié)果圖片

	//創(chuàng)建sift特征檢測(cè)器實(shí)例
	//將SIFT可以換位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征點(diǎn)
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());


	//獲取特征點(diǎn)的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);


	//定義匹配器的實(shí)例化=>方法為暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的參數(shù)可以填string FlannBased等匹配方法

	//第二種實(shí)例化方法
	//BFMatcher matcher;

	//進(jìn)行暴力匹配
	vector<DMatch> matches;

	//第一個(gè)參數(shù)為queryDescription為目標(biāo),第二個(gè)參數(shù)為trainDescription模板
	matcher->match(descriptors1,descriptors2,matches);


	//限制特征點(diǎn)匹配數(shù)量=》只匹配前20個(gè)較好的特征點(diǎn)
	int num = 20;
	nth_element(matches.begin(), matches.begin()+num,matches.end());
	//vector去除20以后的元素
	matches.erase(matches.begin()+num,matches.end());
	

	//輸出關(guān)鍵點(diǎn)和匹配結(jié)果
	//其中右側(cè)圖為trainDescription模板,左側(cè)圖為queryDescription目標(biāo)
	//左圖中的點(diǎn)與右圖中進(jìn)行匹配對(duì)應(yīng)
	drawMatches(src1,keypoints1,src2,keypoints2, matches,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	imshow("匹配結(jié)果",result_img);
	imshow("特征點(diǎn)1",src1);
	imshow("特征點(diǎn)2",src2);

	waitKey(0);
	system("pause");
	return 0;
}

運(yùn)行結(jié)果為:

Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配

代碼2(通過距離進(jìn)行濾波)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>


using namespace cv;  //包含cv命名空間
using namespace std;
using namespace xfeatures2d;


int main() {

	system("color 2E");
	//載入圖片
	Mat src1 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\4.jpg", 1);

	//顯示原圖
	imshow("原圖1",src1);
	imshow("原圖2", src2);

	//定義變量
	vector<KeyPoint> keypoints1, keypoints2;//定義檢測(cè)的特征點(diǎn)存儲(chǔ)容器
	Mat descriptors1,descriptors2;//定義特征點(diǎn)描述信息為Mat類型
	Mat result_img;//匹配結(jié)果圖片

	//創(chuàng)建sift特征檢測(cè)器實(shí)例
	//將SIFT可以換位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征點(diǎn)
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());


	//獲取特征點(diǎn)的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);


	//定義匹配器的實(shí)例化=>方法為暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的參數(shù)可以填string FlannBased等匹配方法

	//第二種實(shí)例化方法
	//BFMatcher matcher;

	//進(jìn)行暴力匹配
	vector<DMatch> matches;

	//第一個(gè)參數(shù)為queryDescription為目標(biāo),第二個(gè)參數(shù)為trainDescription模板
	matcher->match(descriptors1,descriptors2,matches);


	//限制特征點(diǎn)匹配數(shù)量=》只匹配前20個(gè)較好的特征點(diǎn)
	int num = 20;
	nth_element(matches.begin(), matches.begin()+num,matches.end());
	//vector去除20以后的元素
	matches.erase(matches.begin()+num,matches.end());
	
	double Max_distance = matches[1].distance;
	double Min_distance = matches[1].distance;
	vector<DMatch> goodfeatrues;
	
	//根據(jù)特征點(diǎn)的距離去篩選
	for (int i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist>Max_distance)
		{
			Max_distance = dist;
		}
		if (dist<Min_distance)
		{
			Min_distance = dist;
		}
		
	}

	cout << "匹配點(diǎn)的最大距離:" << Max_distance << endl;
	cout << "匹配點(diǎn)的最小距離:" << Min_distance << endl;

	//M為距離閾值,M越大點(diǎn)數(shù)越多
	double M = 1.3;
	for (int  i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist<M*Min_distance)		{
			goodfeatrues.push_back(matches[i]);
		}
	}
	cout << "最終選取特征點(diǎn)的數(shù)量為:" << matches.size() << endl;

	//輸出關(guān)鍵點(diǎn)和匹配結(jié)果
	//其中右側(cè)圖為trainDescription模板,左側(cè)圖為queryDescription目標(biāo)
	//左圖中的點(diǎn)與右圖中進(jìn)行匹配對(duì)應(yīng)
	drawMatches(src1,keypoints1,src2,keypoints2, goodfeatrues,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	imshow("匹配結(jié)果",result_img);
	imshow("特征點(diǎn)1",src1);
	imshow("特征點(diǎn)2",src2);

	waitKey(0);
	system("pause");
	return 0;
}

運(yùn)行結(jié)果為:

Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配

?代碼3(通過knnMatch匹配,可以通過對(duì)distance設(shè)置閾值進(jìn)行濾波,效果最好)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>


using namespace cv;  //包含cv命名空間
using namespace std;
using namespace xfeatures2d;


int main() {

	system("color 2E");
	//載入圖片
	Mat src1 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\喬大花進(jìn)度\\11-18\\sift特征檢測(cè)和匹配\\4.jpg", 1);

	//顯示原圖
	imshow("原圖1",src1);
	imshow("原圖2", src2);

	//定義變量
	vector<KeyPoint> keypoints1, keypoints2;//定義檢測(cè)的特征點(diǎn)存儲(chǔ)容器
	Mat descriptors1,descriptors2;//定義特征點(diǎn)描述信息為Mat類型
	Mat result_img;//匹配結(jié)果圖片

	//創(chuàng)建sift特征檢測(cè)器實(shí)例
	//將SIFT可以換位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征點(diǎn)
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());


	//獲取特征點(diǎn)的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);


	//定義匹配器的實(shí)例化=>方法為暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的參數(shù)可以填string FlannBased等匹配方法

	//第二種實(shí)例化方法
	//BFMatcher matcher;

	//進(jìn)行暴力匹配
	vector<DMatch> matches;

	vector<Mat>train_desc(1, descriptors2);
	matcher->add(train_desc);
	matcher->train();

	vector<vector<DMatch>> matchpoints;
	matcher->knnMatch(descriptors1,matchpoints,2);

	vector<DMatch> goodfeatur;
	for (int i = 0; i < matchpoints.size(); i++)
	{
		if (matchpoints[i][0].distance<0.15*matchpoints[i][1].distance)
		{
			goodfeatur.push_back(matchpoints[i][0]);
		}

	}
	cout << "篩選后的特征點(diǎn)數(shù)量為: " << goodfeatur.size() << endl;

	//輸出關(guān)鍵點(diǎn)和匹配結(jié)果
	//其中右側(cè)圖為trainDescription模板,左側(cè)圖為queryDescription目標(biāo)
	//左圖中的點(diǎn)與右圖中進(jìn)行匹配對(duì)應(yīng)
	drawMatches(src1,keypoints1,src2,keypoints2, goodfeatur,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	namedWindow("匹配結(jié)果",WINDOW_NORMAL);
	resizeWindow("匹配結(jié)果",500,500);
	imshow("匹配結(jié)果",result_img);

	waitKey(0);
	system("pause");
	return 0;
}

運(yùn)行結(jié)果為:

Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配文章來源地址http://www.zghlxwxcb.cn/news/detail-440522.html

到了這里,關(guān)于Opencv(C++)學(xué)習(xí)系列---特征點(diǎn)檢測(cè)和匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • OpenCV(圖像處理)-基于Python-特征檢測(cè)-特征點(diǎn)匹配

    OpenCV(圖像處理)-基于Python-特征檢測(cè)-特征點(diǎn)匹配

    圖像特征就是指有意義的圖像區(qū)域,具有獨(dú)特性,易于識(shí)別性,比如角點(diǎn)、斑點(diǎn)以及高密度區(qū)。而為什么角點(diǎn)具有重要的特征呢? 看下圖: 觀察ABD三張圖片,我們不容易得知圖像的位置,而CEF三張圖我們特別容易找到它們?cè)谠瓐D中對(duì)應(yīng)的位置,這是因?yàn)锳BD比較平滑,我們不

    2024年02月03日
    瀏覽(101)
  • opencv學(xué)習(xí)-特征匹配

    opencv學(xué)習(xí)-特征匹配

    opencv特征匹配方法有兩種,分別是: BF(Brute-Force),暴力特征匹配方法。它使用第一組中的每個(gè)特征的描述子,與第二組中的所有特征描述子進(jìn)行匹配,計(jì)算它們之間的差距,然后將最接近一個(gè)匹配返回。 在進(jìn)行批量特征匹配時(shí),F(xiàn)LANN速度更快。 由于它使用的是鄰近近似值

    2024年02月13日
    瀏覽(15)
  • opencv基礎(chǔ)57-模板匹配cv2.matchTemplate()->(目標(biāo)檢測(cè)、圖像識(shí)別、特征提取)

    opencv基礎(chǔ)57-模板匹配cv2.matchTemplate()->(目標(biāo)檢測(cè)、圖像識(shí)別、特征提取)

    OpenCV 提供了模板匹配(Template Matching)的功能,它允許你在圖像中尋找特定模板(小圖像)在目標(biāo)圖像中的匹配位置。模板匹配在計(jì)算機(jī)視覺中用于目標(biāo)檢測(cè)、圖像識(shí)別、特征提取等領(lǐng)域。 以下是 OpenCV 中使用模板匹配的基本步驟: 加載圖像 : 首先,加載目標(biāo)圖像和要匹配

    2024年02月13日
    瀏覽(17)
  • 特征點(diǎn)的檢測(cè)與匹配(ORB,SIFT,SURFT比較)[opencv-python]

    特征點(diǎn)的檢測(cè)與匹配(ORB,SIFT,SURFT比較)[opencv-python]

    本文旨在總結(jié)opencv-python上特征點(diǎn)的檢測(cè)和匹配。 1、特征點(diǎn)的檢測(cè)(包括:ORB,SIFT,SURFT) 2、特偵點(diǎn)匹配方法 (包括:暴力法,F(xiàn)LANN,以及隨機(jī)抽樣一致性優(yōu)化RANSAC算法) 注:由于SURF專利問題,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安裝opencv-contrib-python包就可以解決 一

    2024年02月06日
    瀏覽(31)
  • opencv基礎(chǔ)49-圖像輪廓02-矩特征cv2.moments()->(形狀分析、物體檢測(cè)、圖像識(shí)別、匹配)

    opencv基礎(chǔ)49-圖像輪廓02-矩特征cv2.moments()->(形狀分析、物體檢測(cè)、圖像識(shí)別、匹配)

    矩特征(Moments Features)是用于圖像分析和模式識(shí)別的一種特征表示方法,用來描述圖像的形狀、幾何特征和統(tǒng)計(jì)信息。矩特征可以用于識(shí)別圖像中的對(duì)象、檢測(cè)形狀以及進(jìn)行圖像分類等任務(wù)。 矩特征通過計(jì)算圖像像素的高階矩來提取特征。這些矩可以表示圖像的中心、尺度

    2024年02月13日
    瀏覽(23)
  • 【課程介紹】OpenCV 基礎(chǔ)入門教程:圖像讀取、顯示、保存,圖像處理和增強(qiáng)(如濾波、邊緣檢測(cè)、圖像變換),特征提取和匹配,目標(biāo)檢測(cè)和跟蹤

    [ 專欄推薦 ] ?? 《視覺探索: OpenCV 基礎(chǔ)入門教程》 ?? ??【簡(jiǎn)介】: Opencv 入門課程適合初學(xué)者,旨在介紹 Opencv 庫(kù)的基礎(chǔ)知識(shí)和核心功能。課程包括圖像讀取、顯示、保存,圖像處理和增強(qiáng)(如濾波、邊緣檢測(cè)、圖像變換),特征提取和匹配,目標(biāo)檢測(cè)和跟蹤等內(nèi)容。學(xué)

    2024年02月16日
    瀏覽(2471)
  • OpenCV圖像特征提取學(xué)習(xí)五,HOG特征檢測(cè)算法

    OpenCV圖像特征提取學(xué)習(xí)五,HOG特征檢測(cè)算法

    一、HOG向梯度直方圖概述 ? 向梯度直方圖(Histogram of Oriented Gradient, HOG)特征是基于對(duì)稠密網(wǎng)格中歸一化的局部方向梯度直方圖的計(jì)算。此方法的基本觀點(diǎn)是:局部目標(biāo)的外表和形狀可以被局部梯度或邊緣方向的分布很好的描述,即使我們不知道對(duì)應(yīng)的梯度和邊緣的位置。在

    2024年02月04日
    瀏覽(36)
  • 學(xué)習(xí)opencv.js之基本使用方法(讀取,顯示,灰度化,邊緣檢測(cè),特征值點(diǎn)檢測(cè))

    學(xué)習(xí)opencv.js之基本使用方法(讀取,顯示,灰度化,邊緣檢測(cè),特征值點(diǎn)檢測(cè))

    OpenCV.js 是 OpenCV(Open Source Computer Vision Library)的 JavaScript 版本。OpenCV 是一個(gè)廣泛使用的計(jì)算機(jī)視覺和圖像處理庫(kù),提供了一系列功能強(qiáng)大的算法和工具,用于處理圖像、視頻、特征提取、對(duì)象識(shí)別等計(jì)算機(jī)視覺任務(wù)。 OpenCV.js 是將 OpenCV 庫(kù)編譯為 JavaScript 的版本,使得開發(fā)者

    2024年02月16日
    瀏覽(22)
  • OpenCV實(shí)戰(zhàn)(18)——特征匹配

    在關(guān)鍵點(diǎn)檢測(cè)一節(jié)中,我們學(xué)習(xí)了如何檢測(cè)圖像中的關(guān)鍵點(diǎn),其目的是用于執(zhí)行局部圖像分析。這些關(guān)鍵點(diǎn)需要足夠獨(dú)特,以便在具有相同對(duì)象的不同圖像中能夠檢測(cè)到相同的點(diǎn)。 基于關(guān)鍵點(diǎn)執(zhí)行圖像分析需要構(gòu)建豐富的表示來唯一地描述這些關(guān)鍵點(diǎn),本節(jié)將重點(diǎn)介紹如何從

    2024年02月03日
    瀏覽(21)
  • OpenCV之特征點(diǎn)匹配

    ????????特征點(diǎn)探測(cè)方法有g(shù)oodFeaturesToTrack(),cornerHarris()和SURF()。一般使用goodFeaturesToTrack()就能獲得很好的特征點(diǎn)。goodFeaturesToTrack()定義: image:源圖像; corners:檢測(cè)到的特征點(diǎn)位置; maxcorner:為返回的特征點(diǎn)個(gè)數(shù)設(shè)置上限。 qualityLevel:反映出一個(gè)角形特征在它之前的強(qiáng)度,設(shè)

    2024年02月12日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包