我使用以下函数创建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 function返回的指针来调整GFTT的blocksize参数?提前感谢您的帮助。
发布于 2013-11-25 20:36:04
您使用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.04EDIT2
您也可以尝试使用this Answer中的代码。它打印出特征检测器的所有参数。打印出参数名称后,您应该会看到类似于"blockSize“的内容。然后,您可以使用此名称通过我原始答案中的代码来设置参数。
发布于 2014-04-04 23:22:16
不知道这是否有帮助,但您也可以使用以下命令创建FeatureDetector-Pointer:
cv::Ptr<cv::FeatureDetector> poKpDtector = new cv::GoodFeaturesToTrackDetector(maxCorners,qualityLevel,minDistance,blockSize,useHarrisDetector,k);您还可以在其中指定blockSize等。
它仍然有同样的缺点,那就是你不能在运行时改变这个参数...
https://stackoverflow.com/questions/20192566
复制相似问题