簡體   English   中英

GPU加速的LK金字塔中的窗口大小限制

[英]Window size limit in GPU accelerated LK pyramid

我在實時Feed上執行圖像穩定,以便在穩定后的圖像上運行某些視覺算法(強調“實時”)。 目前,此過程使用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/中重新發布的內容,但似乎沒有那里有很多活動,因此希望可以提供更好的討論環境!)

補丁大小將作為模板參數傳遞到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)

補丁大小的限制是為了減少模板實例化的數量。 您可以通過修改此代碼並添加更多實例化來增加此限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM