2013-12-11 31 views
1

我正在使用通過以太網端口傳輸它們的高速IP攝像頭拍攝的圖像。在傳輸過程中,偶爾會丟失或損壞幾個字節,而沒有任何視覺影響。當我使用cvLoadImage以序列加載圖像時,通常出現諸如「Corrupt JPEG data:數據段提前結束」或「Corrupt JPEG data:無關字符在標記0 * d9之前」之類的消息。如何在OPENCV中禁用JPEG損壞消息?

我不希望cvLoadImage顯示這樣的錯誤,因爲它們很常見,因爲圖像的高速傳輸。同時打印到控制檯也很耗時,因爲我可能一次處理多達2000張圖像。

如何禁用這些消息。我擁有Opencv 2.0源代碼,如果我獲得正確的指針,可以深入研究它。

附:我試圖調查grfmt_jpeg.cpp和類似的源文件,但沒有在任何地方找到這個錯誤消息。

+0

的Comme在cap_v4l.cpp中(在2.4.7中)提到了用高速攝像機提到的錯誤消息的修復 - 可能這已經在v2.0中。但是,如果您真的只使用OpenCV 2.0,那麼值得檢查升級到2.4.7是否可以解決問題。 – Bull

+0

Opencv 2.0的src/highgui中有一個cap_v4l.cpp。評論說:「解決linux上高分辨率UVC相機的可靠性問題,症狀是圖像損壞和'錯誤的JPEG數據:數據段過早結束'在stderr上」。但是,實際的錯誤消息不會打印在這裏。我的計劃是找到將它打印到stderr的代碼,然後禁用這些代碼行。我正在尋找性能提升,因爲這個錯誤被打印到我的控制檯應用程序中的控制檯,並降低了它的速度。 – marc1886

+0

http://www-personal.umd.umich.edu/~dennismv/corruptjpeg.html這似乎是一個可能的解決方案,也許我必須對libjpeg中的某些代碼進行更改,然後重新編譯它。 jerror.h有一行說JMESSAGE(JWRN_EXTRANEOUS_DATA,「Corrupt JPEG data:%u extraneous bytes before marker 0x%02x」)。 JMESSAGE(JWRN_HIT_MARKER,「損壞的JPEG數據:數據段過早結束」)我會研究它,並希望讓你們知道它是否有效。 – marc1886

回答

0

我不認爲有避免這些錯誤打印輸出的好方法 - 它們起源於libjpeg的核心。

如果您確實想深入瞭解誰在發現錯誤,請查看3rdparty/libjpeg /。看看jerror.h/c

PS。我覺得你的錯誤來自於no_more_bytes -goto-flag在jpeg_fill_bit_buffer()jdhuff.c

0

我重建與BUILD_JPEGWITH_JPEG設置爲true OpenCV的,這樣的OpenCV使用它自己的libjpeg而不是使用系統中的一個,並與3rdparty/libjpeg/jerror.c的fprintf中註釋掉,這當然會禁用比小煩惱可能是更重要的信息,可以洪水標準錯誤:

METHODDEF(void) 
output_message (j_common_ptr cinfo) 
{ 
    char buffer[JMSG_LENGTH_MAX]; 

    /* Create the message */ 
    (*cinfo->err->format_message) (cinfo, buffer); 

#ifdef USE_WINDOWS_MESSAGEBOX 
    /* Display it in a message dialog box */ 
    MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", 
      MB_OK | MB_ICONERROR); 
#else 
    /* Send it to stderr, adding a newline */ 
    // fprintf(stderr, "%s\n", buffer); 
#endif 

} 

的更快選項重定向標準錯誤到/ dev/EG空的,合法的錯誤甚至更多的可能性現在是看不見的:

./cpp-example-bgfg_segm -m knn -c 2>/dev/null