Как макрос CV_OCL_RUN работает в реализации goodFeaturesToTrack из OpenCV (версия 3.4.5)? - PullRequest
0 голосов
/ 16 февраля 2020

Я взглянул на реализацию goodFeaturesToTrack из OpenCV (версия 3.4.5, файловые модули / imgproc / src / featureselect. cpp) и нашел внутри него макрос CV_OCL_RUN. Я ничего не знаю об OpencCL, но я понимаю механизмы препроцессора, обычно используемые в C. Я не понимаю, как это должно работать:

void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
                              int maxCorners, double qualityLevel, double minDistance,
                              InputArray _mask, int blockSize, int gradientSize,
                              bool useHarrisDetector, double harrisK )
{
    CV_INSTRUMENT_REGION();

    CV_Assert( qualityLevel > 0 && minDistance >= 0 && maxCorners >= 0 );
    CV_Assert( _mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image)) );

    CV_OCL_RUN(_image.dims() <= 2 && _image.isUMat(),
               ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,
                                    _mask, blockSize, gradientSize, useHarrisDetector, harrisK))

    Mat image = _image.getMat(), eig, tmp;
    if (image.empty())
    {
        _corners.release();
        return;
    }
    .
    .
    .

Давайте предположим, что это скомпилировано с поддержкой OpenCL, поэтому, где есть макрос CV_OCL_RUN, эффективно вызывается функция ocl_goodFeaturesToTrack. После этого не продолжится ли выполнение строк кода, предназначенных для версий без OpenCL? Я могу подумать о других макросах, определенных на более высоком уровне, которые могут сделать так, что если у вас есть поддержка OpenCL, то функция, на которую я смотрю, не будет вызвана, но я не нашел другой части, где она определена.

1 Ответ

0 голосов
/ 16 февраля 2020

Если я не неправильно понимаю ситуацию, функция не будет продолжать выполняться - макрос содержит оператор return.

Посмотрите возможные варианты расширения CV_OCL_RUN до: https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/opencl/ocl_defs.hpp

Все три варианта CV_OCL_RUN_ возвращаются, если выбран маршрут OpenCL: строки 36, 57 и 67.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...