2013-07-10 45 views
7

Tôi viết một dự án sử dụng OpenCV g ++ và OpenCV 2.4.6Làm thế nào để ngăn chặn thông báo lỗi OpenCV

Tôi có một số mã như thế này:

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; 
} 

Lỗi sẽ được ném khi findHomography thất bại trong việc tìm nhiều thứ. Thông báo lỗi bao gồm:

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 

Vì tôi biết trong điều kiện thông báo sẽ xuất hiện, tôi muốn chặn các thông báo lỗi này. Nhưng tôi không biết phải làm thế nào.

Trong phiên bản cũ của OpenCV, có vẻ như có "cvSetErrMode", theo các bài viết khác, được khấu hao trong OpenCV 2.X. Vậy tôi có thể sử dụng chức năng nào để chặn các thông báo lỗi OpenCV?

Trả lời

13

cv::error() được gọi trên mọi lần xuất hiện lỗi xác nhận. Hành vi mặc định là in câu lệnh xác nhận vào std::cerr.

Bạn có thể sử dụng chức năng cv::redirectError() không có giấy tờ để đặt lệnh gọi lại xử lý lỗi tùy chỉnh. Thao tác này sẽ ghi đè hành vi mặc định của cv::error(). Trước tiên, bạn cần phải xác định một hàm lỗi xử lý tùy chỉnh:

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 
} 

Và sau đó đặt callback trước khi mã mà ném:

cv::redirectError(handleError); 

try { 
    // Etc... 

Nếu bất cứ lúc nào bạn muốn khôi phục lại các hành vi mặc định, bạn có thể làm như vậy:

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

Cảm ơn bạn rất nhiều! Nó hoạt động rất tốt. Làm thế nào bạn tìm thấy chức năng này? – PaulYang

+2

Tôi đã phải làm một số đào trong mã nguồn. – Aurelius

+0

Hàm này được ghi lại ngay bây giờ [ở đây] (http://opencv.jp/opencv-2.2_org/c/core_utility_and_system_functions_and_macros.html#redirecterror) và có sẵn dưới dạng 'cvRedirectError'. Xem thêm mã liên quan của 'error()' [ở đây] (https://github.com/Itseez/opencv/blob/master/modules/core/src/system.cpp). Nó sẽ chỉ gọi điều này thay vì in nó để stderr, nhưng nó vẫn sẽ ném ngoại lệ. – Albert

Các vấn đề liên quan