- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究 Features2D + Homography to find a known object 中的代码OpenCV 教程..
没看清楚,matcher类中的distance变量是什么。是两个图像中匹配关键点的像素之间的距离吗?
这QA说出它的相似性度量(二进制描述符的欧几里得距离或汉明距离)并根据描述符向量之间的距离计算。
能否分享一些信息,了解如何计算此距离或如何在不使用 OpenCV 现有匹配器的情况下匹配关键点。
//-- Step 3: Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::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; // --> What Distance indicate here
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
谢谢。
最佳答案
我在使用 SIFT 特征检测器进行实时对象匹配时遇到了一些问题。这是我的视频解决方案。
首先我创建了一个结构来存储匹配的关键点。该结构包含关键点在模板图像中的位置、关键点在输入图像中的位置和相似性度量。这里我使用向量的互相关作为相似性度量。
struct MatchedPair
{
Point locationinTemplate;
Point matchedLocinImage;
float correlation;
MatchedPair(Point loc)
{
locationinTemplate=loc;
}
}
我将选择根据相似性对匹配的关键点进行排序,因此我需要一个辅助函数来告诉 std::sort()
如何比较我的 MatchedPair
对象。
bool comparator(MatchedPair a,MatchedPair b)
{
return a.correlation>b.correlation;
}
现在主要代码开始了。我使用标准方法从输入图像和模板图像中检测和解密特征。计算特征后,我实现了自己的匹配函数。这就是您正在寻找的答案
int main()
{
Mat templateImage = imread("template.png",IMREAD_GRAYSCALE); // read a template image
VideoCapture cap("input.mpeg");
Mat frame;
vector<KeyPoint> InputKeypts,TemplateKeypts;
SiftFeatureDetector detector;
SiftDescriptorExtractor extractor;
Mat InputDescriptor,templateDescriptor,result;
vector<MatchedPair> mpts;
Scalar s;
cap>>frame;
cvtColor(image,image,CV_BGR2GRAY);
Mat outputImage =Mat::zeros(templateImage.rows+frame.rows,templateImage.cols+frame.cols,CV_8UC1);
detector.detect(templateImage,TemplateKeypts); // detect template interesting points
extractor.compute(templateImage,TemplateKeypts,templateDescriptor);
while( true)
{
mpts.clear(); // clear for new frame
cap>>frame; // read video to frame
outputImage=Mat::zeros(templateImage.rows+frame.rows,templateImage.cols+frame.cols,CV_8UC1); // create output image
cvtColor(frame,frame,CV_BGR2GRAY);
detector.detect(frame,InputKeypts);
extractor.compute(frame,InputKeypts,InputDescriptor); // detect and descrypt frames features
/*
So far we have computed descriptors for template and current frame using traditional methods
From now onward we are going to implement our own match method
- Descriptor matrixes are by default have 128 colums to hold features of a keypoint.
- Each row in descriptor matrix represent 128 feature of a keypoint.
Match methods are using this descriptor matrixes to calculate similarity.
My approach to calculate similarity is using cross correlation of keypoints descriptor vector.Check code below to see how I achieved.
*/
// Iterate over rows of templateDesciptor ( for each keypoint extracted from // template Image) i keypoints in template,j keypoints in input
for ( int i=0;i<templateDescriptor.rows;i++)
{
mpts.push_back(MatchedPair(TemplateKeypts[i].pt));
mpts[i].correlation =0;
for ( int j=0;j<InputDescriptor.rows;j++)
{
matchTemplate(templateDescriptor.row(i),InputDescriptor.row(j),result,CV_TM_CCOR_NORMED);
// I have used opencvs built function to calculate correlation.I am calculating // row(i) of templateDescriptor with row(j) of inputImageDescriptor.
s=sum(result); // sum is correlation of two rows
// Here I am looking for the most similar row in input image.Storing the correlation of best match and matchLocation in input image.
if(s.val[0]>mpts[i].correlation)
{
mpts[i].correlation=s.val[0];
mpts[i].matchedLocinImage=InputKeypts[j].pt;
}
}
}
// I would like to show template,input and matching lines in one output. templateImage.copyTo(outputImage(Rect(0,0,templateImage.cols,templateImage.rows)));
frame.copyTo(outputImage(Rect(templateImage.cols,templateImage.rows,frame.cols,frame.rows)));
// Here is the matching part. I have selected 4 best matches and draw lines // between them. You should check for correlation value again because there can // be 0 correlated match pairs.
std::sort(mpts.begin(),mpts.end(),comparator);
for( int i=0;i<4;i++)
{
if ( mpts[i].correlation>0.90)
{
// During drawing line take into account offset of locations.I have added
// template image to upper left of input image in output image.
cv::line(outputImage,mpts[i].locationinTemplate,mpts[i].matchedLocinImage+Point(templateImage.cols,templateImage.rows),Scalar::all(255));
}
}
imshow("Output",outputImage);
waitKey(33);
}
}
关于OpenCV 关键点匹配 DMatch 距离变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548419/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!