例如,在使用OpenCV时,通常使用SURF等算法来检测关键点.我的问题是这些关键点究竟是什么?
我知道它们是图像中的某种"兴趣点".我也知道它们是尺度不变的并且是圆形的.
此外,我发现他们有方向但我无法理解这实际上是什么.这是一个角度,但在半径和东西之间?你能解释一下吗?我想我首先需要的是更简单的东西,然后更容易理解论文.
我正在尝试一个简单的事情
detector = cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)
并得到这个错误的错误
detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'
Run Code Online (Sandbox Code Playgroud)
我不明白,因为安装了cv2.
cv2.__version__ 是
$Rev: 4557 $
Run Code Online (Sandbox Code Playgroud)
我的系统是Ubuntu 12.04.
也许某人有同样的问题,可以帮助我.
编辑:
长话短说,testypypypy.py:
import cv2
detector = cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "testypypy.py", line 3, in <module>
detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT
Run Code Online (Sandbox Code Playgroud)
如果我认为SURF它是有效的,因为SURF它在,dir(cv2)但如果我也采取cv2.BFMatcher()我得到相同的错误...所以它失踪了,我必须添加它,但我不知道如何.
这里有一些主题对如何找到类似的图片非常有帮助.
我想要做的是获取图片的指纹,并在数码相机拍摄的不同照片上找到相同的图片.SURF算法接缝是独立于缩放,角度和其他失真的最佳方式.
我正在使用带有SURF算法的OpenCV来提取样本图像上的特征.现在我想知道如何将所有这些特征数据(位置,拉普拉斯,大小,方向,粗麻布)转换为指纹或散列.
该指纹将存储在数据库中,并且搜索查询必须能够将该指纹与具有几乎相同特征的照片的指纹进行比较.
更新:
似乎没有办法将所有描述符向量转换为简单的哈希.那么将图像描述符存储到数据库中以便快速查询的最佳方法是什么?
词汇树是一种选择吗?
我会非常感谢任何帮助.
我已经从OpenCV 2.4.9转移到3.0以利用drawMatches和drawMatchesKnn功能.我开始知道它没有像SIFT,SURF这样的非自由算法.所以我通过以下步骤从https://github.com/Itseez/opencv_contrib安装了opencv_contrib
cmake -DOPENCV_EXTRA_MODULES_PATH=/home/zealous/Downloads/opencv_contrib-master/modules /usr/local ..
make -j5
make install
Run Code Online (Sandbox Code Playgroud)
我还交叉检查了opencv的模块,xfeatures2d就在那里.然后,当我试图做
>>> import cv2
>>> help(cv2.xfeatures2d)
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
help(cv2.xfeatures2d)
AttributeError: 'module' object has no attribute 'xfeatures2d'
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么.仅供参考,我使用的是OpenCV 3.0测试版.有没有为xfeatures2d打开 OpenCV的python包装器或者我没有正确安装它?
SURF声称比SIFT更快更强大,但我在测试中发现这不是真的.具有中等图像(600*400)的SIFT与SURF的速度相同,它可以很好地识别物体(甚至可能比SURF更好).
难道我做错了什么?
[编辑]
请注意,有一篇文章解释了如何通过对opencv代码进行一些更改来提高SURF的速度.
如果你认识一些活跃的opencv开发者,请让他看看.
我目前正在开展一个项目,我们有一组用相机拍摄的卡车照片.我需要检测它是什么类型的卡车(它有多少个轮子).所以我正在使用EMGU试图检测到这一点.
我遇到的问题是我似乎无法使用EMGU的HoughCircle检测来检测车轮,它没有检测到所有车轮,也会检测到树叶中的随机圆圈.
所以我不知道接下来我应该尝试什么,我尝试实施SURF算法以匹配它们之间的轮子但这似乎不起作用,因为它们不完全相同,有没有办法我可以实现"松散" SURF算法?
这就是我的开始.
这是Hough Circle检测后得到的结果.许多错误的检测,有些甚至没有接近圆形,并且由于某种原因后轮被检测为单个.

是否可以使用SURF确认检测到的圆圈实际上是轮子并在它们之间进行匹配?我对下一步应该做的事情有点迷茫,任何帮助都会非常感激.
(抱歉英文不好)
UPDATE
这就是我做的.我使用blob跟踪能够在我的照片集中找到斑点.有了这个我有效地可以找到移动卡车.然后我将blob的矩形分成两部分并从那里取下半部分我知道我得到了应该包含轮子的区域,这大大增加了检测.然后我会对我得到的车轮进行轻度强度松动检查.由于它们通常更黑,我应该得到一个相当低的价值,并可以丢弃太白,180/255及以上的任何东西.我也知道我的圆半径不能大于检测区的一半除以一半.

我正在使用OpenCV 2.3进行关键点检测和匹配.但我对检测算法给出的参数size和response参数有点困惑.他们究竟是什么意思?
基于OpenCV手册,我无法弄清楚:
float size:有意义的关键点邻域的直径
float response:选择最强关键点的响应.可用于进一步分类或子采样
我认为跟踪的最佳点是响应最快的那个,但似乎并非如此.那么我怎样才能对冲浪探测器返回的关键点进行二次采样,以便在可跟踪性方面保持最佳?
opencv surf feature-detection template-matching video-tracking
我从源代码构建了openCV 3.0 alpha版本,支持CUDA和TBB.现在,我想使用SURF算法进行特征检测和特征匹配.SurfFeatureDetector出现在包含文件中
opencv2/nonfree/features2d.hpp&opencv2/nonfree/features2d.hpp
但是这个版本的openCV中缺少模块nonfree.我尝试在answers.opencv.org上查看opencv论坛,但该网站正在建设中.
如何使用非免费模块?
我有一个关于与OpenCV匹配的对象的问题.我正在使用opencv 2.3中实现的SURF算法来首先检测每个图像上的特征,然后提取这些特征的描述符.使用Brute Force Matcher进行匹配的问题,我不知道如何判断两个图像是否匹配,就像我使用两个不同的图像一样,两个图像中的描述符之间存在线条!
我的代码的这些输出,无论是两个图像 - 我与它们进行比较 - 都相似或不同,结果图像表明两个图像是匹配的.
问题是:我如何区分这两个图像?
真实匹配:

假匹配!! :

我的代码:
Mat image1, outImg1, image2, outImg2;
// vector of keypoints
vector<KeyPoint> keypoints1, keypoints2;
// Read input images
image1 = imread("C://Google-Logo.jpg",0);
image2 = imread("C://Alex_Eng.jpg",0);
SurfFeatureDetector surf(2500);
surf.detect(image1, keypoints1);
surf.detect(image2, keypoints2);
drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
namedWindow("SURF detector img1");
imshow("SURF detector img1", outImg1);
namedWindow("SURF detector img2");
imshow("SURF detector img2", outImg2);
SurfDescriptorExtractor surfDesc;
Mat descriptors1, descriptors2;
surfDesc.compute(image1, keypoints1, descriptors1);
surfDesc.compute(image2, keypoints2, descriptors2);
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> …Run Code Online (Sandbox Code Playgroud) [编辑] 我设计了一些图像比较代码.匹配的部分仍然有点缺陷,我希望得到一些帮助.该项目可在 - GitHub找到.
我有这两个图像Img1和Img2:

当我在openCV中使用以下命令时
Mat img1 = Highgui.imread("mnt/sdcard/IMG-20121228.jpg");
Mat img2 = Highgui.imread("mnt/sdcard/IMG-20121228-1.jpg");
try{
double l2_norm = Core.norm( img1, img2 );
tv.setText(l2_norm+"");
} catch(Exception e) {
//image is not a duplicate
}
Run Code Online (Sandbox Code Playgroud)
我得到了l2_norm的double值.对于重复的图像对,此双值会有所不同.但是如果图像不同,则抛出异常.这是我识别重复图像的方式吗?还是有更好的方法?我用Google搜索广泛,无法找到真正有说服力的答案.我希望代码和解释如何比较两个图像并获得布尔值true或false取决于图像.
编辑
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,但if条件永远不会满足.我假设有一些差异,但没有任何compare功能Scalar.我该怎么办?
编辑
try{
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
String b=blah.toString();
String b1=blah1.toString();
System.out.println(b+" "+b1);
double comp=b.compareTo(b1);
tv.setText(""+comp);
}
Run Code Online (Sandbox Code Playgroud)
这种方法又有缺陷.虽然它可以用于比较具有相当精确度的图像,但是当图像具有不同的尺寸时它会失败. …