[英]Encountered Segmentation fault in simple OpenCV code
下面的簡單程序段應該在 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 版本。
上一個答案:
您的代碼有一些潛在的問題:
cv::waitKey()
則圖像只能顯示在窗口上;\\\\
而不是/
;這是測試 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.