CV4.1: Неудачное утверждение в функции detectAndCompute level>=0 [решено]

Я сейчас работаю над небольшим алгоритмом, используя ORB. Он должен пересчитать ключевые точки и дескрипторы в какой-то момент, так как их местоположение и размер изменяются. Тем не менее, при вызове detectAndCompute с включенным флагом "useExistingKepoints" происходит сбой при утверждении "level >= 0". Я в замешательстве, поскольку в ключевой точке или дескрипторе нет атрибута с именем level. Мой вопрос: что именно приводит к провалу утверждения и как этого избежать?

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

Keypoint2BoundingBox:

//Create Rect2d with data from the keypoint. 
//Orientation and octave don't need to be saved, since  the object gets reused
//kp: KeyPoint
Rect2d(round(kp.pt.x - kp.size / 2), round(kp.pt.y - kp.size / 2)
       round(kp.size), round(kp.size)));

BoundingBox2Keypoint (результат этого метода передается в ORB, вызывая проблему)

//obtain previous kp object and update it accordingly
//kp: KeyPoint;   rect: Rect2d
kp->size = int(round(max(rect->height,rect->width)));
kp->octave = int(round(size2Octave(kp->size, patchsize, scale)));
kp->pt = Point2f(int(round(rect->x-(rect->width/2))),
int(round(rect->y-(rect->height/2))));

Size2Octave

//Uses keypoint size and some ORB parameters to compute the octave 
//the keypoint would have
//size: Keypoint Size;   patchsize: size of keypoints at octave 0;
//scale: stepsize to next octave
//returns fraction if Keypoint size is not multiple of patchsize
log10(size/patchsize)/log(scale);

1 ответ

Решение

Как вы можете видеть в исходном коде:

 level = keypoints[i].octave;
 CV_Assert(level >= 0);

вам нужно исправить способ вычисления octave

Другие вопросы по тегам