OpenCV的RobustMatch匹配演算法

2021-06-18 05:45:32 字數 3838 閱讀 5251

今天在網上看到乙個比較健壯的影象特徵匹配演算法,遂拿出來與大家分享

class robustmatcher 

// set the feature detector

void setfeaturedetector(cv::ptr& detect)

// set the descriptor extractor

void setdescriptorextractor(cv::ptr& desc)

// set the matcher

void setdescriptormatcher(cv::ptr& match)

// set confidence level

void setconfidencelevel(double conf)

//set mindistancetoepipolar

void setmindistancetoepipolar(double dist)

//set ratio

void setratio(float rat)

cv::mat match(cv::mat& image1, cv::mat& image2, // input images

// output matches and keypoints

std::vector& matches,

std::vector& keypoints1,

std::vector& keypoints2);

cv::mat ransactest(

const std::vector& matches,

const std::vector& keypoints1,

const std::vector& keypoints2,

std::vector& outmatches);

void symmetrytest(

const std::vector>& matches1,

const std::vector>& matches2,

std::vector& symmatches);

int ratiotest(std::vector>& matches);

};

int robustmatcher::ratiotest(std::vector>

&matches)

} else

} return removed;//返回被刪除的點數量

}// insert symmetrical matches in symmatches vector

void robustmatcher::symmetrytest(

const std::vector>& matches1,

const std::vector>& matches2,

std::vector& symmatches)}}}

// identify good matches using ransac

// return fundemental matrix

cv::mat robustmatcher::ransactest(

const std::vector& matches,

const std::vector& keypoints1,

const std::vector& keypoints2,

std::vector& outmatches)

// compute f matrix using ransac

std::vectorinliers(points1.size(),0);

if (points1.size()>0&&points2.size()>0)

}if (refinef)

// compute 8-point f from all accepted matches

if (points1.size()>0&&points2.size()>0)

}} return fundemental;

}// match feature points using symmetry test and ransac

// returns fundemental matrix

cv::mat robustmatcher:: match(cv::mat& image1,

cv::mat& image2, // input images

// output matches and keypoints

std::vector& matches,

std::vector& keypoints1,

std::vector& keypoints2)

cv::mat h = cv::findhomography( obj, scene, cv_ransac ,2);

//-- get the corners from the image_1 ( the object to be "detected" )

std::vectorobj_corners(4);

obj_corners[0]=cvpoint(0,0);

obj_corners[1]=cvpoint(image1.cols, 0 );

obj_corners[2]=cvpoint(image1.cols,image1.rows);

obj_corners[3]=cvpoint(0,image1.rows);

std::vectorscene_corners(4);

cv::perspectivetransform( obj_corners, scene_corners, h);

for( int i = 0; i < 4; i++ )

line( img_matches, scene_corners[0], scene_corners[1], cv::scalar(0, 255, 0), 2 );

line( img_matches, scene_corners[1], scene_corners[2], cv::scalar( 0, 255, 0), 2 );

line( img_matches, scene_corners[2], scene_corners[3], cv::scalar( 0, 255, 0), 2 );

line( img_matches, scene_corners[3], scene_corners[0], cv::scalar( 0, 255, 0), 2 );

imshow("test",img_matches);

cvwaitkey(0);

//****************************************=測試**

// return the found fundemental matrix

return fundemental;

}

剔除低質量匹配點

ratiotest用來剔除距離比例相差過大的配對點,配對點之間的距離相差越大,能匹配上的概率也就越小。這裡使用乙個引數ratio來控制剔除距離相差在一定範圍之外的特徵點。

symmetrytest用來判斷兩個影象間的特徵點匹配是否是一一對映,對於不是的點則剔除掉

void main()

最後,對於opencv中的所有特徵匹配演算法都可以用這個辦法來做,比如sift, surf等等。只需要簡單的替換第一步中的extractor和detector就可以了。

匹配效果還不錯,上個圖

但是缺點也是存在的,如果完整匹配下來,大約一幀耗時100+ms,不適合實時性要求較高的應用

如何學習Opencv資料?opencv的安裝使用

opencv是什麼,相信搞機器視覺的朋友都清楚。但是很多搞機器視覺的朋友卻是對他又愛又恨。愛它因為它是免費的,如果能夠好好掌握它,並運用到自己的機器視覺專案中,還是可以一定程度上降低專案成本。恨它是因為它不太好學習。原因有以下幾個 1 國內有關opencv的中文著作太少了,就2本,而且還是1.1版本...

OpenCV學習 OpenCV中的工具函式

opencv庫中還提供了一些專用功能,可以更好的處理計算機視覺中普遍出現的數學和其他問題。在庫的環境中它們被稱為工具函式。工具函式包含數學操作 測試 錯誤生成 記憶體與執行緒處理 優化及其他的工具。函式名稱 描述cv alignptr 對齊指標到給定位元組數 cv alignsize 將緩衝區大小給...

opencv學習 opencv的資料型別 2

cv rect類 矩陣類包含point類的x,y 矩陣左上角 size類的width和height 矩陣大小 預設構造 cv rect r 拷貝構造 cv rect r2 r1 數值初始化 cv rect r x,y,w h 點座標及大小初始化構造 cv rect r p,sz 兩點初始化構造 cv...