2013-07-10 23 views
7

Piszę projektu OpenCV używając g ++ i OpenCV 2.4.6Jak pominąć komunikat o błędzie OpenCV

Mam kod jak poniżej:

try 
{ 
    H = findHomography(obj, scene, CV_RANSAC); 
} 
catch (Exception &e) 
{ 
    if (showOutput) 
     cout<< "Error throwed when finding homography"<<endl; 
    errorCount++; 
    if (errorCount >=10) 
    { 
     errorCount = 0; 
     selected_temp = -99; 
     foundBB = false; 
     bb_x1 = 0; 
     bb_x2 = 0; 
     bb_y1 = 0; 
     bb_y2 = 0; 
    } 
    return -1; 
} 

Błąd zostanie wyrzucony, gdy nie udało się znaleźć findHomography rzeczy. Komunikat o błędzie zawiera:

OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) 
== npoints && points1.type() == points2.type()) in findHomography, 
file /Users/dji-mini/Downloads/opencv- 2.4.6/modules/calib3d/src/fundam.cpp, 
line 1074 
OpenCV Error: Assertion failed (count >= 4) in cvFindHomography, 
file /Users/dji-mini/Downloads/opencv-2.4.6/modules/calib3d/src/fundam.cpp, line 235 

Ponieważ wiem, w jakich komunikat wydaje warunki, chcę tłumić te komunikaty o błędach. Ale nie wiem, jak to zrobić.

W starej wersji OpenCV wydaje się, że istnieje "cvSetErrMode", który, zgodnie z innymi artykułami, jest amortyzowany w OpenCV 2.X. Więc jakiej funkcji mogę użyć do tłumienia komunikatów o błędach OpenCV?

Odpowiedz

13

cv::error() wywoływana jest przy każdym wystąpieniu błędu asercji. Domyślne zachowanie polega na wydrukowaniu stwierdzenia asercji na std::cerr.

Możesz użyć nieudokumentowanej funkcji cv::redirectError(), aby ustawić niestandardowe wywołanie zwrotne błędu. Spowoduje to zastąpienie domyślnego zachowania cv::error(). Trzeba najpierw zdefiniować niestandardowy obsługi błędów funkcję:

int handleError(int status, const char* func_name, 
      const char* err_msg, const char* file_name, 
      int line, void* userdata) 
{ 
    //Do nothing -- will suppress console output 
    return 0; //Return value is not used 
} 

a następnie ustawić zwrotnego przed kodem, który rzucał:

cv::redirectError(handleError); 

try { 
    // Etc... 

Jeśli w dowolnym momencie chcesz przywrócić domyślne zachowanie, ty można to zrobić:

cv::redirectError(nullptr); //Restore default behavior; pass NULL if no C++11 
+0

Dziękuję bardzo! Pracuje bardzo dobrze. Jak znalazłeś tę funkcję? – PaulYang

+2

Musiałem trochę pogrzebać w kodzie źródłowym. – Aurelius

+0

Funkcja jest teraz udokumentowana [tutaj] (http://opencv.jp/opencv-2.2_org/c/core_utility_and_system_functions_and_macros.html#redirecterror) i dostępna jako 'cvRedirectError'. Zobacz także powiązany kod 'error()' [here] (https://github.com/Itseez/opencv/blob/master/modules/core/src/system.cpp). Po prostu wywoła to zamiast drukować na stderr, ale nadal będzie wyrzucać wyjątek. – Albert

Powiązane problemy