Linux和Windows构建应用程序之间的OpenCV行为差异

时间:2016-10-15 22:45:30

标签: c++ linux opencv g++ mingw-w64

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

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

我发布的代码太多,并希望每个人都能排序,所以我的基本问题是,我应该特别寻找一些东西吗?现在我正在Ubuntu的笔记本电脑上调试它,但是如果有人在过去有类似的经验并且知道要立即寻找的东西,它可以节省我一些时间。

感谢

我应该提一下我正在使用的功能:

cv::cvtColor
cv::Blur
cv::Canny
cv::FindContours
cv::fitLine
cv::fitEllipse

3 个答案:

答案 0 :(得分:3)

图像加载可能是其中一种情况。请尝试匹配Windows&中的像素值。在imread之后的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标志。

Link

答案 1 :(得分:1)

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

答案 2 :(得分:1)

从你给我们的一些信息中我可以告诉你OpenCV算法和函数是独立于平台的。 OpenCV docuemntations中提到的唯一内容是:

可移植性,外部依赖性

正式地,代码必须符合C ++ 98标准。目前还不建议在实现级别使用C ++ 11或TR1扩展,并且禁止在外部头文件中使用它。 应该摆脱依赖于编译器或平台的构造和系统调用,例如:

  • 编译器pragma'
  • 特定关键字,例如__stdcall,__ inline,__ int64(或很长)。改为使用CV_INLINE(或C ++代码中的简单内联),CV_STDCALL(尽可能避免使用),int64。
  • 编译器扩展,例如最小和最大特殊宏,重载宏等。
  • 内联汇编
  • Unix或Win32特定的调用,例如bcopy,readdir,CreateFile,WaitForSingleObject等。
  • 具体数据大小而不是sizeof(sizeof(int)而不是4),字节顺序((int )" \ x1 \ x2 \ x3 \ x4&#34 ;是0x01020304或0x04030201或什么?),简单的char而不是signed char或unsigned char除文本字符串以外的任何地方。使用短格式uchar表示unsigned char,使用schar表示signed char。使用预处理程序指令来处理不可移植的代码段。

来源:here

尝试查看代码中的某些内容是否与平台有关。 在我看来(但这只是一种感觉),可能它与OpenCV Mats中的数字表示有关。尝试查看某些内容是否依赖于平台int大小或浮点大小......

我能想到的全部......