In my main.cpp I have an excerpt:
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 is saying:
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
So one would expect that inspectPoint()
is a function that is actually doing something.
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 }
I am using Visual Studio 2013 and the optimization is set to "Full Optimization (/Ox)".
As far as I know, FAST algorithm goes through all pixels? I suppose it is not possible that it actually processes each pixel faster than the function inspectPoint()
.
How is FAST detector so fast? Or rather, why is the nested loop so slow?