В моей 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? Вернее, почему вложенная петля такая медленная?
Из быстрого просмотра исходного кода, похоже, существует обширная оптимизация для SSE и OpenCL в fastFeatureDetector: https://github.com/Itseez/opencv/blob/master/modules/features2d/src/fast.cpp – BHawk
Итак, если я правильно понимаю, написав код для конкретного процессора, вы можете получить более быстрые ускорения x4? Или, может быть, детектор FAST использует GPU, когда это возможно? Оба они кажутся неправдоподобными, но я не эксперт .... – ancajic
SSE и OpenCL не относятся ни к одному процессору. SSE использует способность ЦП одновременно выполнять одну инструкцию (вычисление) на нескольких фрагментах данных. Таким образом, в зависимости от архитектуры процессора это может улучшить скорость всего лишь 2x или выше 4х. OpenCL может использовать графический процессор, который также может обеспечить значительное повышение производительности для определенных операций обработки изображений. – BHawk