[英]OpenCV 2.2 SURF Feature matching problems
我已經修改了 OpenCV 演示應用程序“matching_to_many_images.cpp”以從網絡攝像頭(右)查詢圖像(左)到幀。 第一張圖片的右上角出了什么問題?
我們認為這與我們遇到的另一個問題有關。 我們從一個空數據庫開始,我們只添加唯一的(與我們數據庫中的特征不匹配的特征)但是在只添加了三個特征之后,我們得到了所有新特征的匹配......
我們正在使用: SurfFeatureDetector surfFeatureDetector(400,3,4); SurfDescriptorExtractor surfDescriptorExtractor; FlannBasedMatcher flannDescriptorMatcher;
我認為這與邊界關鍵點有關。 檢測器檢測關鍵點,但要使 SURF 描述符返回一致的值,它需要周圍像素塊中的像素數據,這在邊界像素中不可用。 您可以使用以下代碼段在檢測到關鍵點之后但在計算描述符之前刪除邊界點。 我建議使用 20 或更多的borderSize。
removeBorderKeypoints( vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize )
{
if( borderSize > 0)
{
keypoints.erase( remove_if(keypoints.begin(), keypoints.end(),
RoiPredicatePic((float)borderSize, (float)borderSize,
(float)(imageSize.width - borderSize),
(float)(imageSize.height - borderSize))),
keypoints.end() );
}
}
RoiPredicatePic 實現為:
struct RoiPredicatePic
{
RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY)
: minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY)
{}
bool operator()( const cv::KeyPoint& keyPt) const
{
cv::Point2f pt = keyPt.pt;
return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY);
}
float minX, minY, maxX, maxY;
};
此外,近似最近鄰索引並不是匹配圖像對之間特征的最佳方式。 我建議您嘗試其他更簡單的匹配器。
您的方法完美無缺,但由於錯誤地調用了drawMatches function,它顯示了錯誤的結果。
你的錯誤調用是這樣的:
drawMatches(image2, image2Keypoints, image1, image1Keypoints, matches, result);
正確的調用應該是:
drawMatches(image1, image1Keypoints, image2, image2Keypoints, matches, result);
我遇到了同樣的問題。 令人驚訝的是,該解決方案與邊界點或 KNN 匹配器無關。 只需要一個不同的匹配策略來從過多的匹配中過濾掉“好的匹配”。
使用 2 NN 搜索,以及以下條件 -
如果 distance(1st match) < 0.6*distance(2nd match) 第一場比賽是“好比賽”。
過濾掉所有不滿足上述條件的匹配,只為“好的匹配”調用 drawMatches。 瞧!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.