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

如何在OPENCV中禁用JPEG损坏消息?,opencv,libjpeg,Opencv,Libjpeg,我正在使用高速IP摄像机拍摄的图像,该摄像机通过以太网端口传输图像。在传输过程中,偶尔会丢失或损坏一些字节,而不会产生任何视觉影响。当我使用cvLoadImage按顺序加载图像时,通常会出现“损坏的JPEG数据:数据段过早结束”或“损坏的JPEG数据:标记0*d9之前的多余字节”之类的消息 我不希望cvLoadImage显示这样的错误,因为它们由于图像的高速传输而很常见。另外,打印到控制台也很耗时,因为我可能一次处理多达2000张图像 如何禁用这些消息。我有Opencv 2.0的源代码,如果我得

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

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

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


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

我认为没有一种好的方法可以避免这些错误打印输出-它们源自libjpeg的核心

如果您确实想深入研究,看看到底是谁在发出错误,请查看3rdparty/libjpeg/。看看jerror.h/c


PS.我认为您的特定错误来自jdhuff.c中的
jpeg\u fill\u bit\u buffer()
中的no\u more\u bytes-goto标志
,随着第三方/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

cap_v4l.cpp(在2.4.7中)中的注释提到了对您提到的高速摄影机错误消息的修复-可能这已经在v2.0中了。但是,如果您确实只使用OpenCV 2.0,则值得检查升级到2.4.7是否解决了此问题。OpenCV 2.0的src/highgui中有一个cap_v4l.cpp。评论说“修复了linux上高分辨率UVC摄像头的可靠性问题。症状是损坏的图像和stderr上“损坏的JPEG数据:数据段过早结束”。但是,此处不打印实际的错误消息。我的计划是找到将其打印到stderr的代码,然后禁用这些代码行。我正在寻找性能提升,因为这个错误会被打印到我的控制台应用程序中的控制台上,并使它变慢。这似乎是一个可能的解决方案,也许我必须更改libjpeg中的一些代码,然后重新编译它。h中有几行写着JMESSAGE(JWRN_externeous_DATA,“损坏的JPEG数据:%u标记0x%02x之前的额外字节”)。JMESSAGE(JWRN_HIT_MARKER,“损坏的JPEG数据:数据段过早结束”)我将对此进行研究,希望能让你们知道它是否有效。