Linux和Windows构建的应用程序之间的OpenCV行为差异
OpenCV behavior differences between Linux and Windows built application
我在Windows上编写并测试了一个使用OpenCV进行图像评估的应用程序。使用OpenCV 3.1.0,使用MinGW-W64 5.3.0编译。
现在,我已经克隆了这个应用程序,并在Linux环境中构建和测试了它。我先在Raspberry Pi上做了这个测试(Raspian Jessie),然后在我的笔记本电脑上做了这个测试(Ubuntu 16.04, g++ 5.4.0)。我评估了相同的图像,得到了不同的结果。有太多的代码,我发布和期望每个人排序,所以我的基本问题是,有什么是我应该特别寻找?现在我正在我的笔记本电脑上调试它,但是如果有人在过去有过类似的经历,并且知道要立即寻找的东西,可以节省我一些时间。
感谢我应该提到我使用的函数:
cv::cvtColor
cv::Blur
cv::Canny
cv::FindContours
cv::fitLine
cv::fitEllipse
图片加载可能是其中一种情况。请尝试匹配windows &linux或mac后的imread
。基于不同的版本&编解码器安装在机器上,它可以变化很小。这种像素值不匹配可能发生在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标志。
链接我发现差异与OpenCV无关,是函数"std:: fpclassifier "的行为,我正在检查一条线的斜率是否为"NaN"。我将结果与"1024"进行比较,看看它是否是一个有效的正常数字,即enum"FP_NORMAL"。但是,在linux中编译时,"FP_NORMAL"等于4而不是1024!问题解决了。
根据您提供的少量信息,我可以告诉您OpenCV算法和函数是独立于平台的。OpenCV文档中提到的唯一内容是:
可移植性,外部依赖
在形式上,代码必须符合c++ 98标准。不建议在实现级别使用c++ 11或TR1扩展,并且禁止在外部头文件中使用它。应该摆脱依赖编译器或平台的结构和系统调用,例如:
- 编译器编译指示的
- 特定关键字,例如__stdcall, __inline, __int64(或long long)。分别使用CV_INLINE(或c++代码中的简单内联),CV_STDCALL(如果可能的话尽量避免使用),int64。
- 编译器扩展,例如min和max的特殊宏,重载宏等
- 内联汇编
- Unix或win32特定的调用,例如bcopy, readdir, CreateFile, WaitForSingleObject等
- 具体的数据大小代替sizeof's (sizeof(int)而不是4),字节顺序((int)"x1x2x3x4"是0x01020304或0x04030201或什么?),简单的字符而不是有符号字符或无符号字符,除了文本字符串。使用简短形式uchar表示无符号字符,使用简短形式schar表示有符号字符。使用预处理器指令来封装不可移植的代码。
来源:这里
试着看看你的代码中是否有什么是平台相关的。在我看来(但这只是一种感觉),可能它与OpenCV Mats中的数字表示有关。试着看看是否有东西依赖于平台int大小或float大小…
- 如何在 docker 中使用静态 opencv 库编译 c++ 应用程序
- 在Linux/Ubuntu中编译openCV应用程序时,如何解决未定义的引用cv:..?
- Android OpenCV 应用程序的内存问题
- WINDOWS环境下的c++opencv应用程序的低延迟视频流
- IPP如何改进OpenCV应用程序?我该如何整合它
- 在 Eclipse 中使用 JNI 构建 OpenCV 应用程序
- Opencv应用程序在运行时崩溃,错误代码为0x0000142
- 为beaglebone black交叉编译c++openCV应用程序时出现问题
- 在Visual Studio中构建示例opencv应用程序时出错
- 确定模块化OpenCV应用程序的语言/框架
- 在服务器上编译OpenCV / C++应用程序
- 如何在 OpenCV 应用程序中更改跟踪栏的位置
- 与 libstdc++-6.dll 相关的 OpenCV 应用程序崩溃
- OpenCV应用程序(而非库)链接错误
- OpenCV C++应用程序在从Eclipse启动时立即终止
- 在树莓派上编译c++ opencv应用程序出错
- 交叉编译openCV应用程序
- 交叉编译opencv应用程序,未定义引用
- c++ opencv应用程序在c#窗口
- C++程序在OpenCV应用程序中不区分大小写字母