使用ORB描述符检测零关键点

时间:2014-03-19 13:47:25

标签: python descriptor orb

我正在尝试为图像数据库计算ORB(Oriented FAST和Rotated BRIEF)功能。 nexr的任务是使用Bag Of Words方法来计算图像的最终特征。我的问题是,在某些情况下,我从数据库的图像中获得0个关键点(在ORB或BRISK实现中)。我的代码来自here

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()

这里可以做些什么,至少orb找到一个关键点?如何在这些情况下使用密集采样?

1 个答案:

答案 0 :(得分:2)

您可以使用密集的特征检测器,就像在C ++中实现的那样:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#densefeaturedetector

问题是,我不确定是否已将其移植到python中。但是,由于算法不是那么难,你可以自己实现它。这是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 );
}

但是,正如您将注意到的,此实现不处理关键点的角度。如果你的图像有旋转,这可能是个问题。