我尝试使用ORB提取和匹配OpenCV的功能,然后使用ORB进行检测,使用FLANN进行匹配,我得到了一个非常奇怪的结果。加载我的2张图像并将它们转换为灰度后,这里是我的代码:
// Initiate ORB detector
Ptr<FeatureDetector> detector = ORB::create();
// find the keypoints and descriptors with ORB
detector->detect(gray_image1, keypoints_object);
detector->detect(gray_image2, keypoints_scene);
Ptr<DescriptorExtractor> extractor = ORB::create();
extractor->compute(gray_image1, keypoints_object, descriptors_object );
extractor->compute(gray_image2, keypoints_scene, descriptors_scene );
// Flann needs the descriptors to be of type CV_32F
descriptors_scene.convertTo(descriptors_scene, CV_32F);
descriptors_object.convertTo(descriptors_object, CV_32F);
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match( descriptors_object, descriptors_scene, matches );
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors_object.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
//-- Use only "good" matches (i.e. whose distance is less than 3*min_dist )
vector< DMatch > good_matches;
for( int i = 0; i < descriptors_object.rows; i++ )
{
if( matches[i].distance < 3*min_dist )
{
good_matches.push_back( matches[i]);
}
}
vector< Point2f > obj;
vector< Point2f > scene;
for( int i = 0; i < good_matches.size(); i++ )
{
//-- Get the keypoints from the good matches
obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );
scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );
}
// Find the Homography Matrix
Mat H = findHomography( obj, scene, CV_RANSAC );
// Use the Homography Matrix to warp the images
cv::Mat result;
warpPerspective(image1,result,H,Size(image1.cols+image2.cols,image1.rows));
cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows));
image2.copyTo(half);
imshow( "Result", result );
这是我得到的奇怪结果的屏幕截图: screen shot
可能是什么问题?
谢谢!
答案 0 :(得分:1)
您遇到了错误匹配的结果:符合数据的单应性不是“真实的”,因此会扭曲图像。
您可以使用example中的imshow( "Good Matches", img_matches );
调试匹配mask
。
有多种方法可以改善您的比赛:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication37
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
WebBrowser web = new WebBrowser();
private void button1_Click(object sender, EventArgs e)
{
string[] url = new string[3] {"www.google.com","www.yahoo.com","www.bing.com" };
web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted);
web.ScriptErrorsSuppressed = true;
for (int i = 0; i < url.Length; i++)
{
web.Navigate(url[i]);
}
}
void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
string surce = web.DocumentText;
}
}
}
来识别完全错误的单应性计算答案 1 :(得分:0)
ORB是二元特征向量,不能与Flann一起使用。请改用Brute Force(BFMatcher)。