2014-03-19 4 views
1

Я пытаюсь вычислить функции ORB (ориентированные FAST и Rotated BRIEF) для базы данных изображений. Задача nexr - использовать подход Bag Of Words, чтобы рассчитать окончательные характеристики изображений. Моя проблема в том, что в некоторых случаях я получаю 0 ключевых точек из изображений базы данных (либо в ORB, либо в реализации BRISK). Мой код от here.Обнаружение нулевых ключевых точек с использованием дескриптора ORB

img = cv2.imread('D:/_DATABASES/clothes_second/striped_141.descr',0) 
orb = cv2.ORB() 
kp = orb.detect(img,None) 
kp, des = orb.compute(img, kp) 
img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0) 
plt.imshow(img2),plt.show() 

Что можно сделать здесь, по крайней мере, найти одну ключевую точку? Как можно использовать плотную выборку для этих случаев?

ответ

2

Вы можете использовать плотный детектор функции, как один, реализованного в C++: http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#densefeaturedetector

Дело в том, что я не уверен, что она была портирована на питона еще. Но, поскольку алгоритм не так уж и трудный, вы можете реализовать его самостоятельно. Вот реализация в C++:

void DenseFeatureDetector::detectImpl(const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask) const 
{ 
    float curScale = static_cast<float>(initFeatureScale); 
    int curStep = initXyStep; 
    int curBound = initImgBound; 
    for(int curLevel = 0; curLevel < featureScaleLevels; curLevel++) 
    { 
     for(int x = curBound; x < image.cols - curBound; x += curStep) 
     { 
      for(int y = curBound; y < image.rows - curBound; y += curStep) 
      { 
       keypoints.push_back(KeyPoint(static_cast<float>(x), static_cast<float>(y), curScale)); 
      } 
     } 

     curScale = static_cast<float>(curScale * featureScaleMul); 
     if(varyXyStepWithScale) curStep = static_cast<int>(curStep * featureScaleMul + 0.5f); 
     if(varyImgBoundWithScale) curBound = static_cast<int>(curBound * featureScaleMul + 0.5f); 
    } 

    KeyPointsFilter::runByPixelsMask(keypoints, mask); 
} 

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