首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调整只有FeatureDetector::create function返回的指针的GFTT的"blocksize“参数?

如何调整只有FeatureDetector::create function返回的指针的GFTT的"blocksize“参数?
EN

Stack Overflow用户
提问于 2013-11-25 20:01:42
回答 2查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
 poKpDetector1 = FeatureDetector::create( "GFTT" );

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

代码语言:javascript
复制
    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”参数。

以下两次尝试均失败:

代码语言:javascript
复制
 poKpDetector1->set( "blocksize", MyInpParamsStruct.nKpDet_GFTT1_BlockSize );

代码语言:javascript
复制
 (*((cv::GFTTDetector*)((poKpDetector1).obj))).blockSize = MyInpParamsStruct.nKpDet_GFTT1_BlockSize;

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

EN

回答 2

Stack Overflow用户

发布于 2013-11-25 20:36:04

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

尝试:

代码语言:javascript
复制
poKpDetector1->set( "blockSize", MyInpParamsStruct.nKpDet_GFTT1_BlockSize );

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

代码语言:javascript
复制
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即可。默认值为:

代码语言:javascript
复制
int maxCorners=1000
double qualityLevel=0.01,
double minDistance=1.
int blockSize=3,
bool useHarrisDetector=false
double k=0.04

EDIT2

您也可以尝试使用this Answer中的代码。它打印出特征检测器的所有参数。打印出参数名称后,您应该会看到类似于"blockSize“的内容。然后,您可以使用此名称通过我原始答案中的代码来设置参数。

票数 0
EN

Stack Overflow用户

发布于 2014-04-04 23:22:16

不知道这是否有帮助,但您也可以使用以下命令创建FeatureDetector-Pointer:

代码语言:javascript
复制
cv::Ptr<cv::FeatureDetector> poKpDtector = new cv::GoodFeaturesToTrackDetector(maxCorners,qualityLevel,minDistance,blockSize,useHarrisDetector,k);

您还可以在其中指定blockSize等。

它仍然有同样的缺点,那就是你不能在运行时改变这个参数...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20192566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档