DrT*_*arr 5 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
Run Code Online (Sandbox Code Playgroud)
图像加载可能就是其中之一。之后请尝试匹配windows & linux或mac中的像素值imread
。根据机器上安装的不同版本和编解码器,它可能会略有不同。对于 jpg、png、tiff 等压缩图像格式,可能会发生像素值不匹配的情况。对于 pgm、bmp 等未压缩格式或原始格式,则不应发生这种情况。请阅读 opencv 文档中的以下几行:
1/ 该函数根据内容而不是文件扩展名来确定图像的类型。
\n\n2/ 在 Microsoft Windows 操作系统和 MacOSX 上,默认使用 OpenCV 图像附带的编解码器(libjpeg、libpng、libtiff 和 libjasper)。因此,OpenCV 始终可以读取 JPEG、PNG 和 TIFF。在 MacOSX 上,还可以选择使用本机 MacOSX 图像读取器。但请注意,由于 MacOSX 中嵌入了颜色管理,目前这些本机图像加载器会提供具有不同像素值的图像。
\n\n3/ 在 Linux、BSD 版本和其他类 Unix 开源操作系统上,OpenCV 会寻找操作系统映像提供的编解码器。安装相关软件包(不要忘记开发文件,例如 Debian 和 Ubuntu 中的 \xe2\x80\x9clibjpeg-dev\xe2\x80\x9d)以获得编解码器支持或在 CMake 中打开 OPENCV_BUILD_3RDPARTY_LIBS 标志。
\n\n\n我发现差异与 OpenCV 完全无关,而是函数“std::fpclassify”的行为,我在其中检查直线的斜率是否为“NaN”。我将结果与“1024”进行比较,看看它是否是有效的正常数字,即枚举“FP_NORMAL”。然而,在linux中编译时,“FP_NORMAL”等于4而不是1024!问题解决了。