2010-02-02 54 views
3

我使用OpenCV 1來做一些圖像處理,並且對cvSetErrMode函數(它是CxCore的一部分)感到困惑。OUTDATED - OpenCV的錯誤模式

OpenCV有三種錯誤模式。

  • Leaf:程序在調用錯誤處理程序後終止。
  • 父級:程序未終止,但調用了錯誤處理程序。
  • 沉默:類似於父模式,但沒有錯誤處理程序被稱爲

在我的代碼的開始,我叫cvSetErrMode(CV_ErrModeParent)從默認的「葉」轉換模式「父」模式,我的應用程序不會以異常/斷言彈出而終止。 不幸的是,'父'模式似乎沒有工作。我仍然彈出消息對話框,並且我的應用程序仍然終止。

如果我調用cvSetErrMode(CV_ErrModeSilent),那麼它實際上是沉默,不再退出應用程序或拋出一個對話框......但這也意味着我不知道發生了錯誤。在這種情況下,我認爲模式設置正確。

有沒有其他人看到過這種行爲,並可能能夠推薦一個解決方案?

參考文獻:

+1

嗨@Fuzz,編輯一個4歲的問題可能是一個可怕的想法,因爲主題(和ye ole c-api)今天不再相關。 – berak 2014-05-04 05:57:46

+0

評論@berak。最近有人把它+1,所以一定讀過它。我重新閱讀並注意到錯誤,並無法幫助我的自我。 – Fuzz 2014-05-04 09:27:06

回答

5

我要回答我的問題,因爲經過一番擺弄周圍我曾發生了什麼。

當您切換到「父」模式而不是葉模式時,會出現一個名爲cvGuiBoxReport()的錯誤處理程序。 cvGuiBoxReport()是默認的錯誤處理程序。看起來,即使在父模式下,cvGuiBoxReport()仍然會終止您的應用程序!哎呀。

因此,爲了解決這個問題,你可以編寫你自己的錯誤處理程序,並重定向錯誤進行處理,而不是終止應用程序。

一個例子錯誤處理程序:

int MyErrorHandler(int status, const char* func_name, const char* err_msg, const char* file_name, int line, void*) 
{ 
    std::cerr << "Woohoo, my own custom error handler" << std::endl; 
    return 0; 
} 

您可以設置父模式和重定向你的錯誤:

cvSetErrMode(CV_ErrModeParent); 
cvRedirectError(MyErrorHandler); 
+2

謝謝,我有類似的問題,但發現'cvSetErrMode'沒有必要被調用。相反,我設置了'cv :: redirectError(myErrorHandler)',後來通過調用'cv :: redirectError(cv :: ErrorCallback())'來取消更改。 – Unapiedra 2011-11-24 17:39:47

1

在上載損壞或空的圖像,我們的形象轟然服務器的一週處理服務器,這裏有一些關於我如何解決OpenCV的錯誤處理錯綜複雜的想法。我們在C++服務器中使用V2.2。

問題出現在cv::imread()cv::imdecode()當要加載的圖像損壞(或空)時。通常,OpenCV只是通過一些錯誤消息退出進程,當您運行一臺應該始終工作的服務器時,這並不是一個好主意。

https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/core/include/opencv2/core/core.hpp查看源代碼,我忽略了一絲的源代碼註釋爲cv::setBreakOnError(),發現了這以下模式工作:

cv::setBreakOnError(true); // Can be set globally 
... 
... 
cv::Mat srcImage = cv::imread(filename, 1); 
if (!srcImage.data) throw std::exception("bad image"); 

cv::imread()現在不會退出的過程,但將控制權交給自己的異常處理,所以你可以用它做你喜歡的。

發現這一點節省了很多心痛。

+0

偉大的信息保羅 – Fuzz 2012-02-11 02:59:20