如何在OPENCV中禁用JPEG损坏消息?

时间:2013-12-11 22:13:42

标签: opencv libjpeg

我正在使用高速IP摄像机拍摄的图像,通过以太网端口传输它们。在传输过程中,偶尔丢失或损坏几个字节而没有任何视觉影响。当我使用cvLoadImage按顺序加载图像时,经常出现“损坏的JPEG数据:数据段的过早结束”或“损坏的JPEG数据:标记0 * d9之前的无关字节”之类的消息。

我不希望cvLoadImage显示此类错误,因为它们由于图像的高速传输而很常见。打印到控制台也非常耗时,因为我可能一次处理多达2000张图像。

如何禁用这些消息。我有Opencv 2.0源代码,如果我得到正确的指针,可以深入研究它。

P.S。我尝试了查看grfmt_jpeg.cpp和类似的源文件,但没有在任何地方找到此错误消息。

2 个答案:

答案 0 :(得分:0)

我认为没有一种漂亮而简洁的方法来避免这些错误的打印输出 - 它们来自libjpeg的核心。

如果您确实想深入了解谁发现错误,请查看3rdparty / libjpeg /。看看 jerror.h / c

PS。我认为您的特定错误来自 jdhuff.c jpeg_fill_bit_buffer() no_more_bytes -goto-flag

答案 1 :(得分:0)

我将BUILD_JPEG WITH_JPEG重置为opencv设置为true,以便opencv使用自己的libjpeg而不是使用系统,并且3rdparty/libjpeg/jerror.c中的fprintf已注释掉,当然禁用可能比可以淹没stderr的轻微烦恼更重要的消息:

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

}

更快的选择是将stderr重定向到/ dev / null,例如,现在看不到合法错误的更多可能性:

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