TL; DR:是否有RANSAC的C++实现或其他可以与任意2D点集自由使用的强大对应算法?
我知道存在许多包括或利用诸如RANSAC(随机抽样共识)之类的对应算法的实现.它们经常用于计算机视觉应用中,并且可以在诸如OpenCV,PCL等的库中找到.通用算法是众所周知的,并且各种站点列出了不同的步骤.
现在,我发现的所有"高级"实现(为OpenCV,PCL等完成)都是针对具有一组基本假设的特定类型的问题.在OpenCV中,您希望在第一个图像和第二个图像的一部分(此示例)之间找到单应矩阵.在PCL中,您处于3D点云领域,而且(据我所知)您只能匹配特定的,已定义的形状(线条,球体等).
我"简单地"想要做的是采取任意2D点集(可能包含一些噪声)并在更大的2D点集合中找到对应关系(其中也包含一些噪声和其他点).除了输入两组点之外,它不需要特定的模型训练.我正在使用C++实现它,但是:
我不是一个经验丰富的程序员,我需要整个事情来执行得相当快; 我自己已经完成的众所周知的算法(边缘检测,高斯模糊等)已经证明比经过验证的实现要慢得多(> 10x).
简单地扯掉已经存在的开源实现(例如OpenCV)已被证明超出了我目前的能力(过多的依赖关系和虚拟实现模板等等)
所以,如果有人知道我错过了一个可以自由使用(BSD之类)和经过验证的C++实现......
在C++中,我声明了一个自定义类来存储对象的某些值.然后,我声明了所述对象的向量.最后,我遍历向量以为字段赋值.
#include <vector>
using namespace std;
class Custom
{
public:
int metric,nX,nY;
private:
};
int main( int argc, char** argv )
{
vector<Custom> MyWonderfulVector;
// Some code//
for(int i=0 ; i<10 ; i++){
MyWonderfulVector[i].metric = computation1();
MyWonderfulVector[i].nX= computation2();
MyWonderfulVector[i].nY= computation3();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它vector subscript out of range试图评估时会抛出一个MyWonderfulVector[i].metric = computation1();.metric也是一个int computation1().在第一次迭代中,i = 0所以它应该没问题.奇怪的是,在代码的其他地方,我有另一个类的向量(包含在库中),这个语法适用于它,所以我不明白为什么它在这里不起作用.
编辑:
好的评论我改为以下行:vector MyWonderfulVector(10);
所以我的问题是我没有初始化向量的大小(来自Matlab的坏习惯;))据我所知,如果我没有将向量初始化为固定大小,我必须推送对象以"增加"矢量的大小.所以,我应该创建一个临时的自定义对象来分配字段,然后将这个临时对象push_back到向量中.如果其中一位评论者希望将其纳入答案......
(这是一个相关的问题,但与我的案例有所不同,这使我怀疑我对它的理解).
我有这门课:
class MyOwnClass
{
public:
int score; Specialcustomtype val1; double index;
private:
};
Run Code Online (Sandbox Code Playgroud)
和MyOwnClass的向量
vector<MyOwnClass> MySuperVector(20);
Run Code Online (Sandbox Code Playgroud)
有一些代码将值设置为MyOwnClass的字段,我想找到向量中的哪个MyOwnClass具有最高值的字段分数.
在相关问题的答案中:
#include <algorithm> // For std::minmax_element
#include <tuple> // For std::tie
#include <vector> // For std::vector
#include <iterator> // For global begin() and end()
struct Size {
int width, height;
};
std::vector<Size> sizes = { {4, 1}, {2, 3}, {1, 2} };
decltype(sizes)::iterator minEl, maxEl;
std::tie(minEl, maxEl) = std::minmax_element(begin(sizes), end(sizes),
[] (Size const& s1, Size const& …Run Code Online (Sandbox Code Playgroud) 我有这个代码片段,我在我的程序(C++和OpenCV)中到处使用.它用于计时某些操作:
double t;
// Some code...
t = (double)getTickCount();
Object1.LotOfComputing();
t = 1000*((double)getTickCount() - t)/getTickFrequency();
cout << "Time for LotOfComputing =" << t << " milliseconds."<< endl;
cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << endl;
Run Code Online (Sandbox Code Playgroud)
这就是OpenCV doc建议对代码的功能/部分进行计时的方式,它在使用几周后似乎对我有用.我测量的时间从大约1毫秒到700毫秒,我将它们舍入到毫秒.
问题是我在程序中计算了很多不同的操作,代码被这些片段弄得乱七八糟.
我想知道将这些代码行放入函数是否明智,例如:
double timing(double time){
timing = 1000*((double)getTickCount() - time)/getTickFrequency();
cout << "Time for LotOfComputing =" << timing << " milliseconds."<< endl;
cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << endl;
return timing;
}
Run Code Online (Sandbox Code Playgroud)
所以我可以使用这个:
double t;
// Some code...
t = (double)getTickCount();
Object1.LotOfComputing();
timing(t);
Run Code Online (Sandbox Code Playgroud)
我只关心通过函数调用的执行时间......也许我只是在担心什么都没有!
使用时findHomography():
Mat H = findHomography( obj, scene, cv::RANSAC , 3, hom_mask, 2000, 0.995 );
Run Code Online (Sandbox Code Playgroud)
有时,对于某些图像,生成的H矩阵保持为空(H是UINT8,1x0x0).然而,两个图像之间显然存在匹配(并且看起来好像检测到良好的关键点匹配),并且只是片刻之前,具有相似关键点响应的两个相似图像,生成相关矩阵.输入参数"obj"和"场景"都是Point2f包含各种坐标的矢量.
这是一个常见的问题吗?或者你认为某个小虫可能潜伏在某个地方?就个人而言,我已经处理了数百个存在匹配的图像,虽然我看到有时匹配不佳,但这是我第一次得到一个空矩阵......
编辑:这就是说,即使我的眼睛认为图像对中应该有一个匹配,我意识到它可能会混淆图像的某些部分与另一个,并且可能确实没有"好"的匹配.
所以我的问题是:findHomography()当它无法找到合适的Homography时如何表现?它是返回一个空矩阵还是总是给出单应性,尽管它很差?我只是想知道我是否遇到标准行为或者我自己的代码中是否存在错误.