【问题标题】:Encountered Segmentation fault in simple OpenCV code在简单的 OpenCV 代码中遇到分段错误
【发布时间】:2020-06-15 18:34:34
【问题描述】:

工具

  • 平台:64 位 Windows
  • 编译器链:mingw 与 Qt
  • 制作系统:CMake
  • 库:C++ 11、OpenCV 4、Qt 5

问题(更新)

下面的简单程序段应该编译并在 OpenCV 中显示生成的图像。但是,它始终只在调试模式下使用 SIGSEGV(最后是回溯)。但是,它在 RELEASE 模式下工作得很好。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;

void testOPENCV()
{
   cv::Mat output(480, 640, CV_8UC3, cv::Scalar(255,0,100));
   cv::namedWindow( "Test", cv::WINDOW_AUTOSIZE );
   cv::imshow("Test",output);
   cv::waitKey(0);
}

int main(int argc, char** argv)
{
   testOPENCV();
   return 0;
}

我有一个 CMake 脚本,它只构建所需的 OpenCV 模块并将这些模块链接到依赖项。相关部分:

build_external_project(opencv "https://github.com/opencv/opencv.git" "4.2.0" "-DCMAKE_INSTALL_PREFIX=${THIRDPARTY_INSTALLFOLDER} - DCMAKE_BUILD_TYPE=${THIRDPARTY_BUILDTYPE} -DBUILD_LIST=core,imgproc,imgcodecs,highgui")

target_link_libraries(OpenVideo ${OpenCV_LIBS})

二进制文件可以在没有丢失 dll 错误的情况下运行。 Dependency walker 也表示相同。

这是回溯:

【问题讨论】:

  • “这个简单的程序段应该编译”,不,不应该。我没有看到main()。我没有看到适当的头文件得到#included。仅仅因为您的程序在此处因回溯而崩溃并不意味着这就是问题所在。 C++ 不能以这种方式工作。该错误可能在您的代码中的任何位置。这就是为什么 stackoverflow.com 的 help center 会为您提供创建 minimal reproducible example 的说明,以便任何人都可以完全如图所示剪切/粘贴代码、编译、运行和重现您的问题。您没有遵循这些说明,因此不太可能有人可以帮助您。
  • 发布您的 .pro 文件也会很有帮助
  • 您是否在运行代码之前在行中插入断点?
  • @ManjunathReddy 我在 Visual Studio,opencv 3.4.5 中测试了这段代码,在调试和发布中没有问题。检查你的 opencv 安装是否有调试模式。那里可能有错误

标签: c++ windows opencv cmake mingw


【解决方案1】:

https://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html

你忘了创建窗口

namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.

【讨论】:

    【解决方案2】:

    这里有几件事要检查。

    首先,OpenCV 库从何而来?它是为你的 CPU 编译的吗?看起来它在 AVX 指令中崩溃了。可能是 CPU 不支持它们。

    第二个,一点也不明显,发生在.png 文件中。运行时相同的段错误。事实证明,OpenCV 是在没有 png 支持的情况下构建的。请检查您的 OpenCV 是否使用 -DWITH_JPEG=ON 构建。

    【讨论】:

    • 是的,OpenCV 是为我的 CPU(64 位 Intel Xeon E2146G)编译的。请注意,问题似乎与图像类型无关,因为显示生成的矩阵也会失败。
    【解决方案3】:

    鉴于 OpenCV 在发布模式下工作正常,我建议重建库的调试版本。

    上一个答案

    您的代码存在一些潜在问题:

    • 在此示例中不需要使用 Qt,它会增加您现在不需要的复杂性。根据 CMake 脚本中的链接指令将其从项目及其库中删除。稍后,您可以将其带回以查看是否是导致崩溃的原因。现在您需要确定问题出在 OpenCV 还是 Qt 中。
    • 如果调用cv::waitKey(),图像只能显示在窗口上;
    • Windows 上的目录分隔符通常是\\ 而不是/

    这是测试您的 OpenCV 构建的完整源代码:

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    int main()
    {
       std::string file_name("C:\\Images\\1.jpg");
       cv::Mat original_image = cv::imread(file_name, cv::IMREAD_COLOR);
       if (original_image.empty())
       {
           std::cout << "!!! image not found" << std::endl;
           return -1;
       }
    
       cv::imshow( "Display window", original_image ); 
       cv::waitKey(0);
    
       return 0;
    }
    

    【讨论】:

    • 让我们确保阻碍您的发展的不是基础知识。
    • 问题肯定出在 OpenCV 上,如更新后的问题所示。
    • 很高兴您更新了问题并考虑了我的建议。尽管如此,对有助于您微调问题的答案进行投票是一种很好的品味。我相信您可能没有正确构建 OpenCV 的 Debug 版本,因为 Release 版本可以正常工作。
    • 注意编译器是:MinGW。 MinGW 默认使用“/”目录分隔符。
    【解决方案4】:

    添加到 karlphillips 答案:Deubg 和 Release 在 Windows 上的行为与在 Linux 上的行为完全不同(由于运行时选择)。

    特别是如果您链接到 Windows 上的发布库,但您的库或可执行文件是在调试中构建的。如果他们使用不同的运行时,您很可能会遇到问题和段错误。因此,请检查两个项目的标志(典型的罪魁祸首是多线程(调试)等标志出现在一个项目上,而另一个项目没有出现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 2017-09-12
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多