在快速查询大型数据库中的类似图像或文本时,我正在阅读很多关于词汇树的内容.但是我找不到关于这样的词汇树是什么以及如何构建其中一个特征的任何好的(易于理解的)描述.
所以,我正在尝试缝合由微芯片显微镜拍摄的图像,但很难将所有特征对齐.我已经在两个相邻图像之间有50%的重叠,但即便如此,它并不总是很合适.
我正在使用SURF和OpenCV来提取关键点并找到单应矩阵.但是,它仍然远远不是一个可接受的结果.
我的目标是能够完美地缝合2x2图像,所以这样,我可以递归地重复该过程,直到我有最终图像.
你有什么建议吗?一个很好的算法来解决这个问题.或者也许是一种转换图像的方法,以便能够从中提取更好的关键点.使用阈值(较小的一个获得更多的关键点,或更大的关键点?).
现在,我的方法是首先缝合两个2x1图像,然后将这两个图像拼接在一起.它与我们想要的很接近,但仍然不能接受.此外,问题可能是图像曾经是"源"(而第二个图像是通过矩阵与一个图像重叠而变换)可能不会有点错位,或者该图像上的小角度会影响整个结果.
任何帮助或建议表示赞赏.特别是允许使用OpenCV和SURF的任何解决方案(即使我不完全反对其他库......只是因为大部分项目都是用它开发的).
谢谢!
我一直在使用EMGU CV库中的SURF特征检测示例.
到目前为止它的工作令人惊讶; 我可以检测到2个给定图像之间的匹配对象,但是我遇到了关于图像不匹配的问题.
我一直在寻找论坛的支持,但他们从我所处的地方开始.有谁知道哪些参数决定图像是否匹配.当我使用不匹配的2张图像进行测试时,代码仍会像匹配一样进行,并且即使没有匹配也会在图像的随机位置绘制模糊的粗红线.
如果没有匹配,我希望打破代码,不再继续.
附录:
static void Run()
{
Image<Gray, Byte> modelImage = new Image<Gray, byte>("HatersGonnaHate.png");
Image<Gray, Byte> observedImage = new Image<Gray, byte>("box_in_scene.png");
Stopwatch watch;
HomographyMatrix homography = null;
SURFDetector surfCPU = new SURFDetector(500, false);
VectorOfKeyPoint modelKeyPoints;
VectorOfKeyPoint observedKeyPoints;
Matrix<int> indices;
Matrix<float> dist;
Matrix<byte> mask;
if (GpuInvoke.HasCuda)
{
GpuSURFDetector surfGPU = new GpuSURFDetector(surfCPU.SURFParams, 0.01f);
using (GpuImage<Gray, Byte> gpuModelImage = new GpuImage<Gray, byte>(modelImage))
//extract features from the object image
using (GpuMat<float> gpuModelKeyPoints = surfGPU.DetectKeyPointsRaw(gpuModelImage, null))
using (GpuMat<float> gpuModelDescriptors = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用(C++)OpenCv开始使用筛选功能提取.我需要使用SIFT提取特征,在原始图像(例如书籍)和场景之间匹配它们,然后计算相机姿势.
到目前为止,我已经使用SURF 找到了这个算法.有没有人知道我可以开始使用的基本代码,或者可能是将链接中的算法从SURF转换为SIFT的方法?
提前致谢.
编辑: 好的,我为筛选问题找到了解决方案.现在我正试图想出相机的姿势.我正在尝试使用:solvePnP,任何人都可以帮我一个例子吗?
我一直在尝试使用EMGU示例SURFFeature来确定图像是否在图像集合中.但我在理解如何确定是否找到匹配时遇到问题.
.........原始图像.............................. Scene_1(匹配)..... .................... Scene_2(不匹配)
...................
...................

我一直在查看文档并花了几个小时寻找可能的解决方案,如何确定图像是否相同.正如您在下面的图片中看到的那样,两者都匹配.

很明显,我试图找到的那个获得更多的匹配(连接线),但我如何在代码中检查这个?
问题:如何过滤出好的匹配?
我的目标是能够将输入图像(从网络摄像头捕获)与数据库中的图像集合进行比较.但在我将所有图像保存到数据库之前,我需要知道我可以将输入与哪些值进行比较.(例如,在数据库中保存objectKeypoints)
这是我的示例代码(匹配部分):
private void match_test()
{
long matchTime;
using (Mat modelImage = CvInvoke.Imread(@"images\input.jpg", LoadImageType.Grayscale))
using (Mat observedImage = CvInvoke.Imread(@"images\2.jpg", LoadImageType.Grayscale))
{
Mat result = DrawMatches.Draw(modelImage, observedImage, out matchTime);
//ImageViewer.Show(result, String.Format("Matched using {0} in {1} milliseconds", CudaInvoke.HasCuda ? "GPU" : "CPU", matchTime));
ib_output.Image = result;
label7.Text = String.Format("Matched using {0} in {1} milliseconds", CudaInvoke.HasCuda ? "GPU" : "CPU", matchTime);
}
}
public static void FindMatch(Mat modelImage, Mat observedImage, out long matchTime, …Run Code Online (Sandbox Code Playgroud) 我正在为SURF搜索可用的指标.就像一个图像在一个尺度上与另一个图像匹配时,假设0到1,其中0表示没有相似性,1表示相同的图像.
SURF提供以下数据:
到目前为止,我正在尝试一些东西,但似乎没有任何效果:
使用不同集合的大小的度量:d = N/min(大小(Q),大小(T))其中N是匹配的兴趣点的数量.这给出了非常相似的图像相当低的评级,例如0.32即使从Q中的约600和T中的200匹配70个兴趣点.我认为70是非常好的结果.我正在考虑使用一些对数缩放,所以只有非常低的数字会得到低的结果,但似乎无法找到正确的方程式.随着d = log(9*d0+1)我得到的0.59的结果这是非常好的,但是,它仍然有种破坏SURF的力量.
使用成对距离的度量标准:我做了一些事情,比如找到K最佳匹配并添加它们的距离.两个图像相似的距离最小.这个问题是我不知道兴趣点描述符元素的最大值和最小值是什么,从中计算了距离,因此我只能相对地找到结果(来自许多最好的输入).正如我所说,我希望将度量标准精确地放在0和1之间.我需要将其与其他图像指标进行比较.
这两个问题的最大问题是排除另一个问题.一个没有考虑匹配的数量,另一个没有考虑匹配之间的距离.我迷路了.
编辑:对于第一个,log(x*10 ^ k)/ k的等式,其中k是3或4,大多数时候给出一个很好的结果,min不好,它可以使d大于1 in一些罕见的情况,没有它的小结果又回来了.
我试图实例化一个对象SURF使用OpenCV的Python作为描述在这里,但出现这种情况:
>>> import cv2
>>> cv2.__version__
'2.4.0'
>>> cv2.SURF()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'SURF'
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会发生这种情况,或者如果从OpenCV的Python版本中缺少SURF?
我想使用mayavi.mlab.surf()与mayavi2进行三维绘图.这个函数有一个名为warp_scale的参数,可用于缩放z轴,我正在寻找类似的东西,但是对于x和y轴.
我可以通过乘以x和y数组然后使用mayavi.mlab.axes()中的ranges参数来手动执行此操作来更正轴标签,但是我正在寻找像warp_scale更直接的方法.
谢谢!
我在使用OpenCV的C++中有这个功能:
vector<KeyPoint> test(Mat img)
{
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
vector<KeyPoint> vKeypoints;
detector.detect( img, vKeypoints );
return vKeypoints;
}
Run Code Online (Sandbox Code Playgroud)
当我在main方法中调用此函数时,一切正常.
int main( int, char** argv )
{
// path to a image-file
char* input = "image.jpg";
// read image into Mat img
Mat img = imread( input, CV_LOAD_IMAGE_GRAYSCALE );
// call function test
test(img);
waitKey(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是只要我两次打电话给这个方法......
int main( int, char** argv )
{
// path to a image-file
char* input = "image.jpg";
// read …Run Code Online (Sandbox Code Playgroud) [请求您在标记重复或向下投票之前阅读问题详细信息.我已经彻底搜索过,无法找到解决方案,因此在此处发布问题.]
我试图将一个图像与多个图像进行比较,并获得所有匹配图像的列表.我不想在图像之间绘制关键点.
我的解决方案基于以下源代码:
https://github.com/Itseez/opencv/blob/master/samples/cpp/matching_to_many_images.cpp
上述源代码将一个图像与多个图像匹配,并获得最佳匹配图像.
我修改了上面的示例并生成了:
vector<vector<DMatch>> matches;
vector<vector<DMatch>> good_matches;
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何应用最近邻搜索比率来获得多个图像的良好匹配?
编辑1:
我的实现如下:
对于数据集中的每个图像,计算SURF描述符.
将所有描述符组合成一个大矩阵.
从连接矩阵构建FLANN索引.
计算查询图像的描述符.
在FLANN索引上运行KNN搜索,以查找前20个或更少的最佳匹配图像.K设定为20.
过滤掉上一步计算出的所有不匹配的匹配项.(怎么样??)
我已经成功完成了第1步到第5步.我在第6步遇到问题,我无法删除错误的匹配.