2015-09-29 2 views
1

Я использую VS2012 C++/CLI на 64-разрядной машине Win 8.1 с OpenCV 3.0.Ошибка OpenGV GPU SURF ROI?

Я пытаюсь реализовать версию графического процессора SURF.

Когда я не указываю ROI, у меня нет проблем. Таким образом, следующая строка не дает никаких проблем и определяет ключевые точки в полном изображении:

surf(*dImages->d_gpuGrayFrame,cuda::GpuMat(),Images->SurfKeypoints); 

Однако попытка указать ROI вызвать сбой. Например, я указываю ROI по верхним, левым и нижним, правым координатам (которые, как я знаю, работают в коде, отличном от GPU). В коде GPU следующее приводит к сбою, если ROI меньше, чем исходное изображение (без сбоев, если ROI имеет тот же размер, что и исходное изображение).

int theight = (Images->LoadFrameClone.rows-Images->CropBottom) - Images->CropTop ; 
int twidth = (Images->LoadFrameClone.cols-Images->CropRight)-Images->CropLeft ; 

Rect tRect = Rect(Images->CropLeft,Images->CropTop,twidth,theight); 
cuda::GpuMat tmask = cuda::GpuMat(*dImages->d_gpuGrayFrame,tRect); 

surf(*dImages->d_gpuGrayFrame,tmask,Images->SurfKeypoints); // fails on this line 

Я знаю, что tmask не имеет нулевого размера и что основное изображение является правильным. Насколько я могу судить, единственной проблемой является определение ROI в вызове SURF GPU. Кто-нибудь ведет к тому, почему это может произойти?

Благодаря

+0

Вы печатали tWidth и tHeight? Возможно, Rect не создает правовой ROI (например, область урожая слишком большая)? вы пробовали за очень небольшие размеры посевов? – Micka

+0

tWidth и tHeight были напечатаны динамически, и я вижу, что они правильного размера. Когда tWidth и tHeight имеют тот же размер, что и базовое изображение (т. Е. 1920 x 1080), тогда он работает. Как только tWidth и tHight указаны как меньшие (то есть фактический ROI), тогда он сработает. Я не пробовал действительно небольшие небольшие ROI. Что это будет? – user1805103

+0

ROI и маски - это разные вещи. На самом деле, по-моему, маска должна быть вашей рентабельностью. Можете ли вы попытаться создать 8-битное одноканальное изображение (без ROI), где вы нарисуете заполненную прямоугольную область tRect и используете ее как маску? – Micka

ответ

0

я испытал те же проблемы в OpenCV 3.1. Предположительно, алгоритм SURF не работает с изображениями, которые имеют шаг или шаг, которые были введены путем установки ROI. Я не пробовал маскировать, чтобы понять, не изменилось ли это.

Работать вокруг, чтобы просто скопировать ROI в другой смежный GpuMat. Копии памяти в память почти бесплатны на графическом процессоре (мой GTX780 поддерживает устройство с памятью устройства со скоростью 142 ГБ/с), что делает этот взлом немного менее одиозным.

GpuMat src;       // filled with some image 
GpuMat srcRoi = GpuMat (src, roi); // roi within src 
GpuMat dst; 
srcRoi.copyTo (dst); 
surf(dst, GpuMat(), KeypointsGpu, DescriptorsGpu);