[英]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.