- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在实时馈送上执行图像稳定,以便在稳定的图像上运行一些视觉算法(强调“实时”)。目前,这个使用 LK 金字塔的 CPU 实现版本的过程几乎不够快,即使是在预先构建金字塔时(引用图像和“先前”特征只计算一次),但它需要缩放到处理大约四倍分辨率的图像,这使得它在当前实现中太慢了。我想我可能会尝试通过合并 GPU 来加快速度,因为 OpenCV 已经为支持 CUDA 的设备实现了相同的 LK 方法,即 cv::gpu::PyrLKOpticalFlow 类。我正在使用具有一组先前功能的::sparse 调用。
我的主要问题是窗口大小似乎有限制,我的太大了。该限制作为断言出现在 pyrlk.cpp 文件中:
CV_Assert(patch.x > 0 && patch.x < 6 && patch.y > 0 && patch.y < 6);
在正上方确定补丁尺寸的地方:
void calcPatchSize(cv::Size winSize, dim3& block, dim3& patch)
{
if (winSize.width > 32 && winSize.width > 2 * winSize.height)
{
block.x = deviceSupports(FEATURE_SET_COMPUTE_12) ? 32 : 16;
block.y = 8;
}
else
{
block.x = 16;
block.y = deviceSupports(FEATURE_SET_COMPUTE_12) ? 16 : 8;
}
patch.x = (winSize.width + block.x - 1) / block.x;
patch.y = (winSize.height + block.y - 1) / block.y;
block.z = patch.z = 1;
}
我的问题是我需要一个大约 80x80 像素的窗口大小,这是 A. 为什么我想使用 GPU 加速和 B. 为什么这在 OpenCV 中似乎不起作用。 :) 此外,对于分辨率较大的图像,此窗口大小将需要增大。
我不熟悉实际实现 GPU 加速,所以我想知道是否有人可以解释为什么 OpenCV 中存在这种限制,如果它是由硬件或 OpenCV 实现强加的真正限制,以及是否有工作的方法周围。这似乎是硬件限制,这似乎很奇怪,因为在这些情况下您会想要使用 GPU。我可以使用较小的搜索窗口获得合理的速度,但稳定性对于应用程序来说不够好。
我需要这么大的搜索窗口大小,因为我正在计算第一个(引用)帧的运动。运动是周期性的加上一些小的随机漂移,因此这种方法效果很好,但当匹配特征可能在 30-40 像素远(原始分辨率)时,需要更多的空间来搜索周期的峰值。
这是在 Linux 上使用 OpenCV 2.4.10 版,从源代码构建以支持 CUDA。
(这是从 http://answers.opencv.org/question/54579/window-size-limit-in-gpu-accelerated-lk-pyramid/ 重新发布的(稍作修改),但那里似乎没有太多事件,因此希望 SO 提供更好的讨论环境!)
最佳答案
补丁大小作为模板参数传递给 CUDA 内核。
请参阅 https://github.com/jet47/opencv/blob/master/modules/cudaoptflow/src/cuda/pyrlk.cu#L493 处的调用代码:
static const func_t funcs[5][5] =
{
{sparse_caller<1, 1, 1>, sparse_caller<1, 2, 1>, sparse_caller<1, 3, 1>, sparse_caller<1, 4, 1>, sparse_caller<1, 5, 1>},
{sparse_caller<1, 1, 2>, sparse_caller<1, 2, 2>, sparse_caller<1, 3, 2>, sparse_caller<1, 4, 2>, sparse_caller<1, 5, 2>},
{sparse_caller<1, 1, 3>, sparse_caller<1, 2, 3>, sparse_caller<1, 3, 3>, sparse_caller<1, 4, 3>, sparse_caller<1, 5, 3>},
{sparse_caller<1, 1, 4>, sparse_caller<1, 2, 4>, sparse_caller<1, 3, 4>, sparse_caller<1, 4, 4>, sparse_caller<1, 5, 4>},
{sparse_caller<1, 1, 5>, sparse_caller<1, 2, 5>, sparse_caller<1, 3, 5>, sparse_caller<1, 4, 5>, sparse_caller<1, 5, 5>}
};
其中 sparse_caller
声明为:
template <int cn, int PATCH_X, int PATCH_Y>
void sparse_caller(int rows, int cols, const float2* prevPts, float2* nextPts,
uchar* status, float* err, int ptcount,
int level, dim3 block, cudaStream_t stream)
补丁大小的限制是为了减少模板实例化的数量。您可以通过修改此代码并添加更多实例来根据需要增加此限制。
关于c++ - GPU 加速 LK 金字塔中的窗口大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28389440/
我在实时馈送上执行图像稳定,以便在稳定的图像上运行一些视觉算法(强调“实时”)。目前,这个使用 LK 金字塔的 CPU 实现版本的过程几乎不够快,即使是在预先构建金字塔时(引用图像和“先前”特征只计算
相似度(lk)是密码和用户名中相同字母的数量。但是相似度最终比实际单词大。例如,如果密码是“pie”,而猜测是“die”而不是相似度为 2,因为“i”和“E”的数字相同,所以会得出像 18 这样的数字
或者:如何在 Windows 7 中查找 IIS 元数据库路径? 我以前只运行 aspnet_regiis -lk,但根据 aspnet_regiis 帮助,这是“Windows Vista 中不支持
在 readelf -S 的输出中,我想知道列标题是什么ES , Lk , Inf和 Al意思。 例如: Section Headers: [Nr] Name Type
我是一名优秀的程序员,十分优秀!