OpenCV在Linux和Windows应用程序中的行为差异

5

我有一个应用程序,在Windows上编写和测试,使用OpenCV进行图像评估。它使用的是OpenCV 3.1.0,并且使用MinGW-W64 5.3.0进行编译。

现在,我已经克隆了这个应用程序,并在Linux环境下构建和测试了它。我首先在树莓派上(Raspian Jessie)进行了测试,然后在我的笔记本电脑上进行了测试(Ubuntu 16.04,g++ 5.4.0)。我对相同的图像进行了评估,但得到了不同的结果。

代码太多了,我无法发布并期望每个人都能分析,所以我的基本问题是,是否有什么特定的东西我应该寻找?现在我正在Ubuntu上的笔记本电脑上进行调试,但如果有人过去有类似的经验,并且知道一些可以立即查找的内容,那么可以节省我的时间。

谢谢

我应该提到我正在使用哪些功能:

cv::cvtColor
cv::Blur
cv::Canny
cv::FindContours
cv::fitLine
cv::fitEllipse
3个回答

5

图片加载可能是其中一个问题。请在使用imread后尝试在Windows和Linux或Mac中匹配像素值。基于机器上安装的不同版本和编解码器,它可能会有所变化。这种像素值不匹配可能会发生在压缩图像格式(如jpg、png、tiff等)中。在未压缩格式(如pgm、bmp或原始格式)中不应该出现这种情况。请阅读以下来自opencv文档的内容:

1/ 本函数通过内容而非文件扩展名确定图像类型。

2/ 在Microsoft Windows OS 和 MacOSX上,默认使用OpenCV图像附带的编解码器(libjpeg、libpng、libtiff和libjasper)。因此,OpenCV可以始终读取JPEG、PNG和TIFF。在MacOSX上,还有一种选择是使用本地MacOSX图像读取器。但请注意,由于嵌入到MacOSX中的颜色管理,当前这些本地图像加载程序会产生具有不同像素值的图像。

3/ 在Linux、BSD和其他类Unix开源操作系统上,OpenCV会查找与操作系统映像一起提供的编解码器。安装相关软件包(不要忘记开发文件,例如Debian和Ubuntu中的“libjpeg-dev”)以获取编解码器支持,或在CMake中启用OPENCV_BUILD_3RDPARTY_LIBS标志。

链接


Thubsup。在Windows和Linux下保存为PNG格式的相同位图存在差异,不仅限于MAC。我们放弃了使用PNG格式的参考图像来比较成像结果的非明智想法。 :-) - Markus Sabin

1
我发现差异与OpenCV无关,而是函数“std :: fpclassify”的行为,我正在检查一条线的斜率是否为“NaN”。我将结果与“1024”进行比较,以查看它是否是有效的正常数字,即枚举“FP_NORMAL”。但是,在Linux中编译时,“FP_NORMAL”等于4而不是1024!问题已解决。

哦,好吧,如果你已经找到了解决方案,那么我的回答就没有用了...我在你发帖的时候正在写它...不过我希望你还是能觉得它有趣。 - Luca Angioloni
不,这很有帮助并且一开始就走在了正确的轨道上。最终问题出在浮点数的平台相关处理上。谢谢。 - DrTarr

1

根据您提供的少量信息,我可以告诉您OpenCV算法和函数是跨平台的。在OpenCV文档中唯一提到的是:


可移植性,外部依赖

正式来说,代码必须符合C++ 98标准。目前不建议在实现层面使用C++ 11或TR1扩展,并且禁止在外部头文件中使用它。

应该摆脱编译器相关或平台相关的结构和系统调用,例如:

  • 编译器pragma语句
  • 特定关键字,例如__stdcall、__inline、__int64(或long long)。分别使用CV_INLINE(或C++代码中的简单inline)、CV_STDCALL(如果可能尽量避免使用),int64代替。
  • 编译器扩展,例如min和max的特殊宏、重载宏等。
  • 内联汇编
  • Unix或Win32特定的调用,例如bcopy、readdir、CreateFile、WaitForSingleObject等。
  • 具体数据大小而非sizeof(int)之类的(sizeof(int)而非4),字节顺序((int)"\x1\x2\x3\x4"是0x01020304还是0x04030201还是其他?),除了文本字符串外任何地方都不要使用简单char,而是使用signed char或unsigned char的短格式uchar和schar。使用预处理指令包围不可移植的代码片段。

来源:这里


请尝试查看您的代码是否与平台相关。据我所知(但这只是一种感觉),可能与OpenCV Mats中数字的表示有关。请尝试查看是否有依赖于平台int大小或float大小的内容...

这就是我能想到的全部了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接