2016-04-20 5 views
1

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?

+1

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

+0

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

+1

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

Antwort

2

Von einem schnellen Durchsuchen des Quellcodes es wie es aussieht für SSE und OpenCL in fastFeatureDetector umfangreiche Optimierung ist: github.com/Itseez/opencv/blob/master/modules/features2d/src/‌

SSE und OpenCL sind auf jede CPU nicht 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.