繁体   English   中英

在简单的 OpenCV 代码中遇到分段错误

[英]Encountered Segmentation fault in simple OpenCV code

工具

  • 平台:64 位 Windows
  • 编译器链:mingw with 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 也表示相同。

这是回溯:

堆栈跟踪

很少有事情要检查这里。

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

其次,根本不明显,发生在我身上的.png文件。 运行时相同的段错误。 原来,OpenCV 是在没有png支持的情况下构建的。 请检查您的 OpenCV 是否使用-DWITH_JPEG=ON构建。

鉴于 OpenCV 在 Release 模式下工作正常,我建议重建库的 Debug 版本。

上一个答案

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

  • 在这个例子中不需要使用 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;
}

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

你忘了创建窗口

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM