我已经在(opencv开源)中提取了SIFT功能,并将它们提取为关键点.现在,我想将它们转换为Matrix(带有x,y坐标)或将它们保存在文本文件中......
在这里,您可以看到用于提取关键点的示例代码,现在我想知道如何将它们转换为MAT或将它们保存在txt,xml或yaml中......
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
Run Code Online (Sandbox Code Playgroud) 我正在学习OpenCV,目前我正在尝试理解存储在a中的基础数据,KeyPoint以便我可以更好地利用我正在处理的应用程序的数据.
到目前为止,我一直在浏览这两页:
http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html
然而,当我按照教程使用时drawKeypoints(),这些点的大小和形状都相同,并且使用看似随意的颜色绘制.
我想我可以遍历每个关键点的属性:绘制一个圆圈,绘制一个箭头(为角度),根据响应给它一个颜色,等等.但我认为必须有一个更好的方法.
是否有内置方法或类似的其他方法drawKeypoints()将帮助我更有效地可视化KeyPoints图像?
当我在OpenCV中使用BRISK进行特征检测和描述时,我遇到了性能问题.
基本上我尝试匹配从这个图像得到的所有描述符:
我使用基于flann匹配器的LSH算法和BRISK进行特征检测和描述,从图像数据库中获取所有描述符.
我的图像数据库由242个图像组成.在该242个图像中,存在与在上述"复杂"图像查询中分别拍摄的每个对象相对应的三个图像.
以下是用于BRISK检测的参数(默认opencv参数):Treshold:30,Octaves:4,Pattern scale:1.0.
在使用最佳匹配技术进行flann匹配之后(图像查询中的每个描述符与数据库描述符集中最近的邻域相关联),我的算法输出按匹配百分比排序的数据库图像列表.以下是四个第一个结果:
我使用ORB作为特征检测和描述来比较这些结果.以下是使用的参数:特征数量:2000,比例因子:1.2,金字塔等级数量:8.
以下是我得到的结果:
正如您所看到的,ORB的结果要好得多.首先,在数据库中的每个图像上检测到更多的关键点,并且匹配的百分比对于好的对象明显更好.此外,良好对象的匹配百分比与错误对象的匹配百分比之间的差距更为显着.
我想知道为什么BRISK探测器检测到的关键点比ORB探测器少得多.我已经做了不同的测试来弄清楚如何用BRISK探测器探测更多的关键点(降低阈值,减少八度数).我确实可以检测到更多的关键点,但与ORB检测器的差异仍然非常重要.你知道为什么BRISK探测器有这样的行为吗?
我的OpenCV版本是2.4.8,但我根据这些声明尝试了2.4.4和2.4.9版本的BRISK检测部分:
http://code.opencv.org/issues/2491和BRISK特征检测器检测到零关键点而没有改进.
我还尝试将ORB检测器与BRISK描述相结合.匹配结果优于第一种方法(完全BRISK),但比第二种方法(完整ORB)更差:
请注意,在方法2和方法3中,每个图像上检测到的关键点数量并不相同.实际上,当我在测试图像上运行此代码时(此处为螺栓图像):
// BRISK parameters
int Threshl=30;
int Octaves=4;
float PatternScales=1.0f;
// ORB parameters
int nFeatures=2000;
float scaleFactor=1.2f;
int nLevels=8;
BRISK BRISKD(Threshl, Octaves, PatternScales);
ORB ORBD(nFeatures, scaleFactor, nLevels);
vector<KeyPoint> …Run Code Online (Sandbox Code Playgroud) 在没有回答这个问题之后,我最终遇到了一些有趣的看起来可能的解决方案:
设置好Canny Edge Detector,参考其文档并实现Robust Matcher我链接的第一页中所示的内容之后,我获得了一些徽标/衣服图片,并且将两者结合起来取得了不错的成绩:

但是在其他非常相似的情况下,它关闭了:

与“完全相同”设计相同的不同徽标图像,与上述服装图像相同。
这让我感到奇怪,是否有一种方法可以匹配图像上定义给定图像某些区域的几个特定点?
因此,不是让图像读入然后进行的所有匹配,而是keypoints丢弃“坏” keypoints等。是否有可能让系统知道一个keypoint相对于另一个的位置,然后丢弃一个图像上正确的匹配彼此相邻,但彼此的位置完全不同吗?
(如左图所示,淡蓝色和宝蓝色“匹配”彼此相邻,但在右图的完全分开的部分中匹配)
编辑
对于米卡

“矩形”绘制在(在油漆中添加的)白盒的中心。
cv::Mat ransacTest(const std::vector<cv::DMatch>& matches, const std::vector<cv::KeyPoint>& trainKeypoints, const std::vector<cv::KeyPoint>& testKeypoints, std::vector<cv::DMatch>& outMatches){
// Convert keypoints into Point2f
std::vector<cv::Point2f> points1, points2;
cv::Mat fundemental;
for (std::vector<cv::DMatch>::const_iterator it= matches.begin(); it!= matches.end(); ++it){
// Get the position of left keypoints
float x= trainKeypoints[it->queryIdx].pt.x;
float y= trainKeypoints[it->queryIdx].pt.y;
points1.push_back(cv::Point2f(x,y));
// Get the position of …Run Code Online (Sandbox Code Playgroud) 我有两个图像,有一点点方向左相机,我想从opencv找到方向,我从2图像得到冲浪关键点,我的问题是如何比较这2个关键点找到方向.
在 OpenCV 2.4.3 的参考手册中,它KeyPoint::class_id被描述为“可用于通过它们所属的对象对关键点进行聚类的对象 ID”。
由于我对“关键点”缺乏足够的了解,我无法理解class_id.
我的另一个问题是,通过使用特征检测器、描述符和匹配器,我们可以检测训练图像中查询对象的匹配关键点。但是如何在训练图像中分割出查询对象。我们可以使用抓取或分水岭算法吗?如果是,如何?
任何一个问题的答案都会有所帮助。
提前致谢...
opencv image-processing object-detection image-segmentation keypoint
我花了几个月的时间研究和进行关键点检测,描述和匹配过程的实验.在最后一个时期,我也谈到了增强现实背后的概念,恰恰是"无标记"识别和姿态估计.
幸运的是,我发现以前的概念仍然在这个环境中被广泛使用.创建基本增强现实的常见管道如下,没有详细介绍每个所需的算法:
在拍摄视频时,每一帧......
- 获取一些关键点并创建其描述符
- 找到这些点与之前保存的"标记"内的点之间的匹配(如照片)
- 如果匹配足够,估计可见对象的姿势并使用它
也就是说,这个学生(?)项目使用了一个非常简化的程序.
现在的问题是:在我的个人研究中,我还发现了另一种称为"光流"的方法.我还处在研究的开始阶段,但首先我想知道它与之前的方法有多大不同.特别:
谢谢你的合作.
根据 OpenCV KeyPointresponse文档,每个关键点中都有一个字段:
浮动响应:选择最强关键点的响应。
但我找不到响应越大越好还是越少越好?我想对关键点进行排序,只挑选最好的 20 个。
比较两个图像时feature extraction,如何比较keypoint距离,以忽略明显不正确的距离?
我发现在比较相似的图像时,大多数情况下它可以相当准确,但有时它可以抛出完全独立的匹配.
所以我想keypoints从两个图像中查看两组图像并确定匹配keypoints是否相对位于两者的相同位置.如在其中已知keypoints在图像1上1,2和3相距很远,因此在图像2上匹配的对应关键点应该具有彼此远离彼此相当类似的距离.
我过去曾经使用RANSAC和minimum distance检查但只是为了一些效果,它们似乎并不像我追求的那么彻底.
(使用ORB和BruteForce)
编辑
将"x,y和z"更改为"1,2和3"
编辑2 - 我将尝试使用快速绘制的示例进一步解释:
说我有这个作为我的形象:

我给它这个图像来比较:

它是原始的裁剪和压扁版本,但显然相似.
现在,假设您已经完成了它feature detection并且它返回了这keypoints两个图像的结果:


的keypoints两个图像是在大致相同的区域,并且成比例地相同的距离相互远离.把keypoint我圈起来,我们称之为"Image 1 Keypoint 1".

我们可以看到keypoints周围有5个.它们之间的距离和我想要获得的"Image 1 Keypoint 1",以便将它们与"Image 2 Keypoint 1"及其5个环绕keypoints在同一区域(见下文)进行比较,以便不仅仅是将a keypoint与另一个进行比较keypoint,但要比较基于位置的"已知形状"keypoints.

-
那有意义吗?
我正在研究应用于组织学图像的图像配准方法.
我有一个问题.我想使用MSER特征检测器来检测图像上的关键点.在使用opencv提供的MSER函数检索MSER轮廓之后,我计算每个轮廓的质心,以便将其用作有趣点.
如果我直接描述有趣的点,例如使用Surf描述符,描述符的大小就是1,并且不可能比较它们.
因此,有必要用合适的大小修改描述符的大小.
有没有人有想法?
谢谢
我正在尝试编写一个匹配ORB功能的函数.我没有使用默认匹配器(bfmatcher,flann matcher),因为我只想在图像中使用其他图像中的特征匹配特征.
我看到ORS描述符是一个二进制数组.
我的问题是如何匹配2个特征,即如何找到2个描述符之间的汉明距离?
ORB描述符:
descriptor1 =[34, 200, 96, 158, 75, 208, 158, 230, 151, 85, 192, 131, 40, 142, 54, 64, 75, 251, 147, 195, 78, 11, 62, 245, 49, 32, 154, 59, 21, 28, 52, 222]
descriptor2 =[128, 129, 2, 129, 196, 2, 168, 101, 60, 35, 83, 18, 12, 10, 104, 73, 122, 13, 2, 176, 114, 188, 1, 198, 12, 0, 154, 68, 5, 8, 177, 128]
Run Code Online (Sandbox Code Playgroud)
谢谢.