Как настроить параметр размера блока GFTT, имея только указатель, возвращаемый функцией FeatureDetector::create?

Я использую следующую функцию для создания детектора ключевых точек 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) для настройки параметра «blockSize» для GFTT.

Следующие две попытки не увенчались успехом:

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

or

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

Есть ли способ настроить параметр размера блока GFTT, используя только указатель, возвращаемый функцией FeatureDetector::create? Спасибо заранее за любую помощь.


person Yashil    schedule 25.11.2013    source источник


Ответы (2)


Вы используете blocksize (все строчные буквы), но параметр называется blockSize (camelCase).

Пытаться:

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

EDIT: если вы не возражаете против нескольких дополнительных строк кода, вы можете использовать это:

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

EDIT2:
Вы также можете попробовать код из этого ответа. Он распечатывает все параметры детектора функций. После распечатки имени параметра вы должны увидеть что-то вроде «blockSize». Вы можете использовать это имя для установки параметра, используя код из моего исходного ответа.

person Mailerdaimon    schedule 25.11.2013
comment
Это тоже не работает, @Mailerdaimon. Я пробовал несколько других форм для имени blockSize, и все они вылетают с необработанным исключением во время вызова функции -›set. Мне не удалось найти правильное имя строки для этого параметра в файле features2d_init.cpp. - person Yashil; 26.11.2013
comment
@Yashil хм .. Вот как это должно работать. Однако я дал вам другие возможные решения (см. Отредактированный ответ). Пожалуйста, сообщите, если один из них работает для вас. - person Mailerdaimon; 26.11.2013
comment
Tx для вашего продолжения. Я знаю, что с помощью goodFeaturesToTrack я смогу настроить значение параметра blockSize для функции GFTT. Но, как я сказал в вопросе, я пытаюсь сделать это, используя только указатель, возвращаемый функцией FeatureDetector::create. Я также попробовал функцию алгоритма->getParams из вашей ссылки, но она возвращает только 5 параметров, которые я использовал в моей функции FuncSet_GFTT_InpParams, и не включает blockSize (возвращает только те, которые определены в OpenCVs functions2d_init.cpp). - person Yashil; 26.11.2013
comment
Судя по тому, что я вижу для HARRIS в файле functions2d_init.cpp, он также не будет работать для HARRIS. CV_INIT_ALGORITHM(HarrisDetector, Feature2D.HARRIS, obj.info()->addParam(obj, nfeatures, obj.nfeatures); obj.info()->addParam(obj, qualityLevel, obj.qualityLevel); obj.info()- ›addParam(obj, minDistance, obj.minDistance); obj.info()-›addParam(obj, useHarrisDetector, obj.useHarrisDetector); obj.info()-›addParam(obj, k, obj.k)); - person Yashil; 26.11.2013

Не знаю, поможет ли это, но вы также можете создать FeatureDetector-Pointer с помощью:

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

Там вы можете указать, например. blockSize также.

У него все еще есть тот же недостаток, что вы не можете изменить этот параметр во время выполнения...

person Michael    schedule 04.04.2014