簡體   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