In meinem main.cpp Ich habe einen Auszug:OpenCV FAST Detektor
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();
...
}
Meinedat sagt:
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 würde man erwarten, dass inspectPoint()
eine Funktion, die eigentlich etwas machen.
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
}
Ich verwende Visual Studio 2013 und die Optimierung ist auf "Vollständige Optimierung (/ Ox)" eingestellt.
Soweit ich weiß, geht FAST-Algorithmus durch alle Pixel? Ich nehme an, dass es nicht möglich ist, jedes Pixel schneller als die Funktion inspectPoint()
zu verarbeiten.
Wie ist der FAST Detektor so schnell? Oder, warum ist die verschachtelte Schleife so langsam?
Von einem schnellen Durchsuchen des Quellcodes sieht es aus wie es gibt umfangreiche Optimierung für SSE und OpenCL in FastFeatureDetector: https://github.com/Itseez/opencv/blob/master/modules/features2d/src/fast.cpp – BHawk
Also, wenn ich richtig verstehe, indem Sie Code für eine bestimmte CPU schreiben, können Sie x4 Beschleunigungen überwinden? Oder vielleicht FAST-Detektor beschäftigt GPU wenn möglich? Beide scheinen unplausibel, aber ich bin kein Experte .... – ancajic
SSE und OpenCL sind nicht für jede CPU spezifisch. SSE nutzt die Fähigkeit der CPU, eine einzelne Anweisung (Berechnung) für mehrere Daten gleichzeitig auszuführen. Abhängig von der Architektur der CPU kann dies Geschwindigkeiten von bis zu 2x oder weit über 4x hinaus verbessern. OpenCL kann die GPU verwenden, die auch bestimmten Bildverarbeitungsoperationen erhebliche Leistungssteigerungen verleihen kann. – BHawk