今天在網上看到乙個比較健壯的影象特徵匹配演算法,遂拿出來與大家分享
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...