- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个 C++ 应用程序来比较来自图像的点匹配 (OpenSurf C++),但有时,从数千个“getUniqueMatches”中的 1,应用程序在“getUniqueMatches”中的某个点中断。我有这个日志:
05/13/11 10:17:16: this->pointsA = 227
05/13/11 10:17:16: this->pointsB = 226
05/13/11 10:17:16: this->matches before = 0
05/13/11 10:17:16: 227 226 0 0.650000
05/13/11 10:17:16: Starting in getUniqueMatches
-- And here breaks, inside getUniqueMatches --
这是代码:
inline bool findInVector(std::vector<int> v, int value) {
int size = v.size();
for(int i=0; i<size; i++) {
if(v[i] == value) {
return true;
}
}
return false;
}
void getUniqueMatches(IpVec &ipts1, IpVec &ipts2, IpPairVec &matches, float ratio) {
try {
wLog(f("%d %d %d %f", ipts1.size(), ipts2.size(), matches.size(), ratio));
float dist, d1, d2;
Ipoint *match;
matches.clear();
std::vector<int> matched;
wLog("Starting in getUniqueMatches");
// Breaks after here
int size = ipts1.size();
int size2 = ipts2.size();
for (int i = 0; i < size; i++) {
d1 = d2 = FLT_MAX;
int foundJ = -1;
for (unsigned int j = 0; j < size2; j++) {
dist = ipts1[i] - ipts2[j];
if (dist < d1 && !findInVector(matched, j)) {
d2 = d1;
d1 = dist;
match = &ipts2[j];
foundJ = j;
} else if (dist < d2) {
d2 = dist;
}
}
if (d1 / d2 < ratio) {
ipts1[i].dx = match->x - ipts1[i].x;
ipts1[i].dy = match->y - ipts1[i].y;
matches.push_back(std::make_pair(ipts1[i], *match));
matched.push_back(foundJ);
}
}
} catch(std::exception ex) {
wLog(f("Exception in getUniqueMatches: ", ex.what()));
return;
}
}
只有一些时候会在这里中断。我不知道发生了什么,也许出了什么问题?应用程序在执行此功能时仅使用 1 个线程。提取点时使用 10 个线程。
在 Centos5 (VPS) 上使用它。2 GB 内存使用了 20% 的高清使用 g++(性能模式)编译,IDE 使用 Netbeans。OpenCV,libcurl。
最佳答案
我怀疑两件事:
g++ 编译器优化。使用 -O2
或更少; -O3
有时会产生奇怪的行为,尤其是在浮点运算方面。
如果减少优化不能解决问题,我建议更改
if (d1 / d2 < ratio)
到
if (d1 < double(ratio)*d2)
避免被零除(我认为不太可能发生)并获得更好的精度结果。
关于C++比较冲浪描述符算法匹配有时会中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989255/
我有一张地形图,我想在其中表示一些数据。请参见下图: 右侧用白色圈出的区域是独立于绘图其余部分的冲浪功能。我希望能够做的是改变配色方案。外部应该是灰度,内部应该是基于我与绘图分开的值的单一颜色。目前我
假设我有一个灰度(8 位)图像,并假设我有一个从同一图像创建的完整图像。图片分辨率为 720x576。根据 SURF 算法,每个 Octave 由 4 个盒式过滤器组成,它们由其边上的像素数定义。 第
我想使用 sift/surf 进行模板匹配。图像可以有 1...n 个目标。使用 surf/sift 只能提取一个目标。一种想法是将图像分割成多个片段,然后寻找筛选/冲浪匹配。它有效,但显然由于速度和
OpenCV 内置了许多匹配器,例如 KNN 和 BruteForce。我想知道某处是否存在某些功能,我可以计算两个功能之间的“成本”并自己进行匹配。基本上,我有两个 cv::Keypoint 对象,
我想冲浪这个功能: z=w.'*p %(close form) 哪个: w=[w0; w1] p=[cte0; cte1] 其中,w 是可变的,cte0 和 cte1 可以是任意数字。要使用 surf
我使用 Sift/Surf 和 ORB,但有时我会遇到 drawMatch 函数的问题。 错误在这里: OpenCV Error: Assertion failed (i2 >= 0 && i2 =
我尝试安装(很多次)OpenCV 3.0 for python 和额外的包(筛选、冲浪...)但我总是失败,我真的被卡住了。我在主环境中试过,然后在虚拟环境中试过, 这是我做的: cd git git
我是一名优秀的程序员,十分优秀!