- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
应用程序的重点是从已设置的图像列表中识别图像。图像列表已将其 SIFT 描述符提取并保存在文件中。这里没有什么有趣的:
std::vector<cv::KeyPoint> detectedKeypoints;
cv::Mat objectDescriptors;
// Extract data
cv::SIFT sift;
sift.detect(image, detectedKeypoints);
sift.compute(image, detectedKeypoints, objectDescriptors);
// Save the file
cv::FileStorage fs(file, cv::FileStorage::WRITE);
fs << "descriptors" << objectDescriptors;
fs << "keypoints" << detectedKeypoints;
fs.release();
然后设备会拍照。 SIFT 描述符以相同的方式提取。现在的想法是将描述符与文件中的描述符进行比较。我正在使用 OpenCV 的 FLANN 匹配器来做到这一点。我正在尝试逐个图像地量化相似性。在浏览了整个列表后,我应该找到最好的匹配项。
const cv::Ptr<cv::flann::IndexParams>& indexParams = new cv::flann::KDTreeIndexParams(1);
const cv::Ptr<cv::flann::SearchParams>& searchParams = new cv::flann::SearchParams(64);
// Match using Flann
cv::Mat indexMat;
cv::FlannBasedMatcher matcher(indexParams, searchParams);
std::vector< cv::DMatch > matches;
matcher.match(objectDescriptors, readDescriptors, matches);
匹配后,我了解到我得到了特征向量之间最近发现距离的列表。我找到了最小距离,使用它我可以算出“良好匹配”,甚至可以得到相应点的列表:
// Count the number of mathes where the distance is less than 2 * min_dist
int goodCount = 0;
for (int i = 0; i < objectDescriptors.rows; i++)
{
if (matches[i].distance < 2 * min_dist)
{
++goodCount;
// Save the points for the homography calculation
obj.push_back(detectedKeypoints[matches[i].queryIdx].pt);
scene.push_back(readKeypoints[matches[i].trainIdx].pt);
}
}
我展示了代码的简单部分只是为了让这更容易理解,我知道其中一些不需要在这里。
继续,我希望简单地计算像这样的良好匹配的数量就足够了,但事实证明它主要只是将我指向具有最多描述符的图像。在此之后我尝试的是计算单应性。目的是计算它并查看它是否是有效的同形异义词。希望是一个好的匹配,并且只有一个好的匹配,会有一个很好的单应性变换。在 obj 和 scene 上使用 cv::findHomography 即可创建单应性,它们是 std::vector< cv::Point2f>。我使用在网上找到的一些代码检查了单应性的有效性:
bool niceHomography(cv::Mat H)
{
std::cout << H << std::endl;
const double det = H.at<double>(0, 0) * H.at<double>(1, 1) - H.at<double>(1, 0) * H.at<double>(0, 1);
if (det < 0)
{
std::cout << "Homography: bad determinant" << std::endl;
return false;
}
const double N1 = sqrt(H.at<double>(0, 0) * H.at<double>(0, 0) + H.at<double>(1, 0) * H.at<double>(1, 0));
if (N1 > 4 || N1 < 0.1)
{
std::cout << "Homography: bad first column" << std::endl;
return false;
}
const double N2 = sqrt(H.at<double>(0, 1) * H.at<double>(0, 1) + H.at<double>(1, 1) * H.at<double>(1, 1));
if (N2 > 4 || N2 < 0.1)
{
std::cout << "Homography: bad second column" << std::endl;
return false;
}
const double N3 = sqrt(H.at<double>(2, 0) * H.at<double>(2, 0) + H.at<double>(2, 1) * H.at<double>(2, 1));
if (N3 > 0.002)
{
std::cout << "Homography: bad third row" << std::endl;
return false;
}
return true;
}
我不明白这背后的数学原理,所以在测试时,我有时会用简单的检查单应性的行列式是否为正来代替这个函数。问题是我一直在这里遇到问题。单应性要么都不好,要么在不应该的时候很好(当我只检查行列式时)。
我想我实际上应该使用单应性,对于一些点,只需使用它们在源图像中的位置来计算它们在目标图像中的位置。然后我会比较这些平均距离,理想情况下,在正确图像的情况下,我会得到一个非常明显的更小的平均距离。这根本行不通。所有的距离都是巨大的。我想我可能已经使用单应性的另一种方式来计算正确的位置,但是将 obj 和 scene 相互切换会得到类似的结果。
我尝试的其他事情是 SURF 描述符而不是 SIFT,BFMatcher(蛮力)而不是 FLANN,为每个图像获取 n 最小距离而不是根据最小距离获取数字,或者获取距离取决于全局最大距离。这些方法都没有给我明确的好结果,我现在感到卡住了。
我唯一的下一个策略是使用一些局部阈值或一些用于分割的算法来锐化图像,甚至将它们变成二值图像。我正在寻找任何人可以在我的工作中看到的任何建议或错误。
我不知道这是否相关,但我添加了一些我正在测试的图像。很多时候,在测试图像中,大多数 SIFT vector 来自帧(对比度更高)而不是绘画。这就是为什么我认为锐化图像可能会起作用,但我不想更深入以防万一我之前做的事情是错误的。
图片库是 here与标题中的描述。这些图像具有相当高的分辨率,请查看以防它可能提供一些提示。
最佳答案
您可以尝试测试匹配时,源图像和目标图像之间的线条是否相对平行。如果匹配不正确,就会有很多噪音,并且线条不会平行。
请参阅显示正确匹配(使用 SURF 和 BF)的附加图像 - 所有线大部分都是平行的(尽管我应该指出这是一个简单的示例)。
关于c++ - 使用 FLANN 匹配从 OpenCV SIFT 列表中识别图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23655067/
我正在尝试从我的系统中完全删除 opencv。我试图学习 ROS,而在教程中我遇到了一个问题。创建空工作区后,我调用catkin_make 它给出了一个常见错误,我在 answers.ros 中搜索并
我在尝试逐步转移对warpAffine的调用时遇到崩溃(不是异常): void rotateImage( const Mat& source, double degree, Mat& output )
如何处理opencv gpu异常?是否有用于opencvgpu异常处理的特定错误代码集api? 我尝试了很多搜索,但只有1个错误代码,即CV_GpuNotSupported。 请帮帮我。 最佳答案 虽
笔记 我是 OpenCV(或计算机视觉)的新手,所以告诉我搜索查询会很有帮助! 我想问什么 我想编写一个从图片中提取名片的程序。 我能够提取粗略的轮廓,但反射光会变成噪点,我无法提取准确的轮廓。请告诉
我想根据像素的某个阈值将Mono16类型的Mat转换为二进制图像。我尝试使用以下内容: 阈值(img,ret,0.1,1,CV_THRESH_BINARY); 尝试编译时,出现make错误,提示: 错
我对使用GPU加速的OpenCV中的卷积函数有疑问。 使用GPU的卷积速度大约快3.5 运行时: convolve(src_32F, kernel, cresult, false, cbuffer);
我正在尝试使用非对称圆圈网格执行相机校准。 我通常找不到适合CirclesGridFinder的文档,尤其是findHoles()函数的文档。 如果您有关于此功能如何工作以及其参数含义的信息,将不胜感
在计算机上绘图和在 OpenCV 的投影仪上投影之间有什么区别吗? 一种选择是投影显示所有内容的计算机屏幕。但也许也有这样的选择,即在投影仪上精确地绘制和投影图像,仅使用计算机作为计算机器。如果我能做
我将Processing(processing.org)用于需要人脸跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。 import hyperm
我有下面的代码: // Image Processing.cpp : Defines the entry point for the console application. // //Save
我正在为某些项目使用opencv。并有应解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我
我正在尝试使用以下命令创建级联分类器: haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -n
我试图使用OpenCV检测黑色图像中一组形状的颜色,为此我使用了Canny检测。但是,颜色输出总是返回为黑色。 std::vector > Asteroids::DetectPoints(const
我正在尝试使用OpenCv 2.4.5从边缘查找渐变方向,但是我在使用cvSobel()时遇到问题,以下是错误消息和我的代码。我在某处读到它可能是由于浮点(??)之间的转换,但我不知道如何解决它。有帮
我正在尝试构建循环关闭算法,但是在开始开发之前,我想测试哪种功能描述符在真实数据集上效果更好。 我有两个在两个方向拍摄的走廊图像,一个进入房间,另一个离开同一个房间。因此它们代表相同的场景,但具有2个
有没有一种方法可以比较直方图,但例如要排除白色,因此白色不会影响比较。 最佳答案 白色像素有 饱和度 , S = 0 .因此,在创建直方图时很容易从计数中删除白色像素。请执行下列操作: 从 BGR 转
就像本主题的标题一样,如何在OpenCV中确定图像的特定像素(灰度或彩色)是否饱和(例如,亮度过高)? 先感谢您。 最佳答案 根据定义,饱和像素是指与强度(即灰度值或颜色分量之一)等于255相关联的像
我是OpenCV的新用户,正在从事大学项目。程序会获取输入图像,对其进行综合模糊处理,然后对其进行模糊处理。当对合成模糊图像进行反卷积时,会生成边界伪像,因为...好吧,到目前为止,我还没有实现边界条
我想知道OpenCV是haar特征还是lbp是在多尺度搜索过程中缩放图像还是像论文中提到的那样缩放特征本身? 编辑:事实证明,检测器可以缩放图像,而不是功能。有人知道为什么吗?通过缩放功能可以更快。
我在openCv中使用SVM.train命令(已定义了适当的参数)。接下来,我要使用我的算法进行分类,而不是使用svm.predict。 可能吗?我可以访问训练时生成的支持 vector 吗?如果是这
我是一名优秀的程序员,十分优秀!