如何调整只有特征检测器返回的指针的GFTT "blocksize"参数::创建函数?



我使用以下函数创建GFTT关键点检测器:

 poKpDetector1 = FeatureDetector::create( "GFTT" );

然后调用以下函数来调整其输入参数的期望值:

    void FuncSet_GFTT_InpParams( Ptr<FeatureDetector>& poKpDetector1 )
    {
        poKpDetector1->set( "nfeatures"         , MyInpParamsStruct.nKpDet_GFTT1_MaxCornerNo );
        poKpDetector1->set( "qualityLevel"      , MyInpParamsStruct.dKpDet_GFTT1_QualityLevel );
        poKpDetector1->set( "minDistance"       , MyInpParamsStruct.dKpDet_GFTT1_MinDistance );
        poKpDetector1->set( "useHarrisDetector" , MyInpParamsStruct.bKpDet_GFTT1_UseHarrisDetector );
        poKpDetector1->set( "k"                 , MyInpParamsStruct.dKpDet_GFTT1_HarrisDetectorK );
    }

在features2d_init.cpp中,我找不到如何使用"set"函数(指针指向FeatureDetector类型)来调整GFTT的"blockSize"参数。

以下两次尝试均失败:

 poKpDetector1->set( "blocksize", MyInpParamsStruct.nKpDet_GFTT1_BlockSize );

 (*((cv::GFTTDetector*)((poKpDetector1).obj))).blockSize = MyInpParamsStruct.nKpDet_GFTT1_BlockSize;

有没有办法只使用FeatureDetector::create函数返回的指针来调整GFTT的块大小参数?提前感谢您的帮助。

使用blocksize(小写),但参数命名为blockSize(camelCase)。

尝试:

poKpDetector1->set( "blockSize", MyInpParamsStruct.nKpDet_GFTT1_BlockSize );

编辑:如果你不介意多写几行代码,你可以使用这个:

Mat grayImage = image;
if( image.type() != CV_8U ) cvtColor( image, grayImage, CV_BGR2GRAY );
vector<Point2f> corners;
goodFeaturesToTrack( grayImage, corners, nfeatures, qualityLevel, minDistance, mask,
                     blockSize, useHarrisDetector, k );
keypoints.resize(corners.size());
vector<Point2f>::const_iterator corner_it = corners.begin();
vector<KeyPoint>::iterator keypoint_it = keypoints.begin();
for( ; corner_it != corners.end(); ++corner_it, ++keypoint_it )
{
    *keypoint_it = KeyPoint( *corner_it, (float)blockSize );
}

这是GFTT包装器的实现。在这里,您可以根据需要简单地更改blockSize。默认值为:

int maxCorners=1000
double qualityLevel=0.01,
double minDistance=1.
int blockSize=3,
bool useHarrisDetector=false
double k=0.04

编辑2
你也可以试试这个答案中的代码。它打印出特征检测器上的所有参数。打印出参数名称后,您应该会看到类似"blockSize"的内容。然后,您可以使用这个名称来使用我原始答案中的代码设置参数。

不知道这是否有帮助,但您也可以使用创建FeatureDetector指针

cv::Ptr<cv::FeatureDetector> poKpDtector = new cv::GoodFeaturesToTrackDetector(maxCorners,qualityLevel,minDistance,blockSize,useHarrisDetector,k);

在那里,您也可以指定例如blockSize。

它仍然有同样的缺点,即不能在运行时更改此参数。。。

最新更新