2016-04-20 3 views
1

В моей main.cpp У меня есть отрывок:OpenCV БЫСТРО детектор

Ptr<FastFeatureDetector> fastDetector = FastFeatureDetector::create(80, true); 

while (true) { 
    Mat image = // get grayscale image 1280x720 

    timer.start(); 
    detector->detect(image, keypoints); 
    myfile << "FAST\t" << timer.end() << endl; // timer.end() is how many seconds elapsed since last timer.start() 


    keypoints.clear(); 

    timer.start(); 
    for (int i = 3; i < image.rows - 3; i++) 
    { 
     for (int j = 3; j < image.cols - 3; j++) 
     { 
      if (inspectPoint(image.data, image.cols, i, j)) { 
       // this block is never entered 
       KeyPoint keypoint(i, j, 3); 
       keypoints.push_back(keypoint); 
      } 
     } 
    } 
    myfile << "Custom\t" << timer.end() << endl; 
    myfile << endl; 
    myfile.flush(); 
    ... 
} 

MYFILE говорит:

FAST 0.000515495 
Custom 0.00221361 

FAST 0.000485697 
Custom 0.00217653 

FAST 0.000490001 
Custom 0.00219044 

FAST 0.000484373 
Custom 0.00216329 

FAST 0.000561184 
Custom 0.00233214 

Так можно было бы ожидать, что inspectPoint() это функция, которая на самом деле делать что-то.

bool inspectPoint(const uchar* img, int cols, int i, int j) { 
    uchar p = img[i * cols + j]; 
    uchar pt = img[(i - 3)*cols + j]; 
    uchar pr = img[i*cols + j + 3]; 
    uchar pb = img[(i + 3)*cols + j]; 
    uchar pl = img[i*cols + j - 3]; 

    return cols < pt - pr + pb - pl + i; // just random check so that the optimizer doesn't skip any calculations 
} 

Я использую Visual Studio 2013, а оптимизация установлена ​​на «Полная оптимизация (/ Ox)».

Насколько я знаю, алгоритм FAST проходит через все пиксели? Я полагаю, что невозможно, чтобы он фактически обрабатывал каждый пиксель быстрее, чем функция inspectPoint().

Как быстро детектор FAST? Вернее, почему вложенная петля такая медленная?

+1

Из быстрого просмотра исходного кода, похоже, существует обширная оптимизация для SSE и OpenCL в fastFeatureDetector: https://github.com/Itseez/opencv/blob/master/modules/features2d/src/fast.cpp – BHawk

+0

Итак, если я правильно понимаю, написав код для конкретного процессора, вы можете получить более быстрые ускорения x4? Или, может быть, детектор FAST использует GPU, когда это возможно? Оба они кажутся неправдоподобными, но я не эксперт .... – ancajic

+1

SSE и OpenCL не относятся ни к одному процессору. SSE использует способность ЦП одновременно выполнять одну инструкцию (вычисление) на нескольких фрагментах данных. Таким образом, в зависимости от архитектуры процессора это может улучшить скорость всего лишь 2x или выше 4х. OpenCL может использовать графический процессор, который также может обеспечить значительное повышение производительности для определенных операций обработки изображений. – BHawk

ответ

2

От быстрого просмотра исходного кода это выглядит как есть обширная оптимизация для SSE и OpenCL в fastFeatureDetector: github.com/Itseez/opencv/blob/master/modules/features2d/src/‌

SSE и OpenCL не являются специфическими для любого процессора. SSE использует способность ЦП одновременно выполнять одну инструкцию (вычисление) на нескольких фрагментах данных. Таким образом, в зависимости от архитектуры процессора это может улучшить скорость всего лишь 2x или выше 4х. OpenCL может использовать графический процессор, который также может обеспечить значительное повышение производительности для определенных операций обработки изображений.