Я взглянул на реализацию 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, то функция, на которую я смотрю, не будет вызвана, но я не нашел другой части, где она определена.