Ограничение размера окна в ускоренной графической карте LK пирамиды

Я выполняю стабилизацию изображения на подаче в реальном времени, чтобы запустить некоторые алгоритмы видения для стабилизированных изображений (акцент на «в реальном времени»). В настоящее время этот процесс, который использует CPU реализуемого варианта LK пирамид, едва достаточно быстро, даже когда заранее строить пирамиду (эталонное изображение и «предыдущая» функция только когда вычисляется один раз), но она должна быть расширена до работать с изображениями с разрешением, примерно в четыре раза превышающим его, что делает его слишком медленным в текущей реализации. Я подумал, что мог бы попытаться ускорить процесс за счет включения графического процессора, поскольку OpenCV реализовал тот же подход LK для устройств с поддержкой CUDA, класс 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;
}

Моя проблема в том, что мне нужно окно размером около 80×80 пикселей, а именно А. Почему я хочу использовать ускорение графического процессора и Б. Почему это не работает в OpenCV. 🙂 Кроме того, для изображений с большим разрешением этот размер окна необходимо будет увеличивать.

Я не знаком с реализацией ускорения GPU, поэтому мне интересно, может ли кто-нибудь объяснить, почему это ограничение существует в OpenCV, является ли это реальным ограничением, налагаемым аппаратным обеспечением или реализацией OpenCV, и есть ли способы обойти это. Кажется странным, что это будет аппаратное ограничение, поскольку в таких ситуациях вы хотите использовать графический процессор. Я могу получить разумную скорость с меньшими окнами поиска, но стабилизация недостаточно хороша для приложения.

Мне нужен такой большой размер окна поиска, потому что я расчета движения к первой (опорной) рамы. Движение является циклическим плюс небольшой случайный дрейф, поэтому этот метод работает хорошо, но требует немного больше места для поиска на пиках цикла, когда совпадающие объекты могут находиться на расстоянии около 30-40 пикселей (при исходном разрешении).

Это использует OpenCV версии 2.4.10 для Linux, созданный из исходного кода для поддержки CUDA.

(Это (несколько измененный) повторный пост от http://answers.opencv.org/question/54579/window-size-limit-in-gpu-accelerated-lk-pyramid/, но там, кажется, нет особой активности, так что, надеюсь, SO обеспечивает лучшую дискуссионную среду!)

0

Решение

Размер патча передается ядру 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)

Ограничение размера патча было сделано для уменьшения количества экземпляров шаблона. Вы можете увеличить это ограничение для своих нужд, изменив этот код и добавив дополнительные экземпляры.

3

Другие решения


По вопросам рекламы [email protected]