【问题标题】:OpenCV Mat causes Crash with SIGABRTOpenCV Mat 导致 SIGABRT 崩溃
【发布时间】:2016-11-04 14:09:41
【问题描述】:

我正在通过创建一个 50x50 单通道矩阵来测试 Mat 类的功能,该矩阵一旦显示,就会产生黑色图片。不幸的是,我的程序在以下代码的第 3 行崩溃了:

cv::Mat projImg = cv::Mat::zeros(50, 50, CV_8U);
cv::namedWindow( "Test");
cv::imshow("Test", projImg);

出现错误下级停止,因为它收到了来自操作系统的信号。信号名称:SIGABRT。这很奇怪,因为这段代码非常简单。

我正在使用 Qt 4.0.2 运行 Ubuntu 16.04 64 位。

n.b.即使将 projImg 设置为常规图像,我也会遇到相同的错误

cv::Mat projImg = cv::imread("/home/is/Downloads/test.jpg");

【问题讨论】:

    标签: c++ qt opencv ubuntu


    【解决方案1】:

    您的基本OpenCV 功能不太可能出现故障。因此,您的 OpenCV 可能未配置为使用 Qt 支持构建。
    清单:

    1. 消除所有highgui 方法以确保核心OpenCV 工具正常工作。您可以将namedWindowimshow 替换为imwrite
    2. 再次检查您的OpenCV 构建过程并查找特定的Qt 选项。如果您使用的是CMake,请查找With Qt 切换和相关的Qt 路径。

    【讨论】:

    • 到目前为止我尝试过的所有 opencv 函数都运行良好(例如 imread、imwrite、cvtColor 等转换)。显然我只对imshow有问题。至于我的 OpenCV 构建过程,我已按照 Qt 网站 wiki.qt.io/OpenCV_with_Qt 上建议的说明进行操作
    【解决方案2】:

    我也有同样的问题。简单的答案是 - 使用 Qt 调用进行事件处理和绘制图像。将CV矩阵显示到Qt屏幕上比较简单。

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        if (argc != 2)
            return  -1;
    
        MyWindow w{};
        w.loadImage(argv[1]);
        w.show();
    
        return a.exec();
    }
    
    
    
    void MyWindow::loadImage(const char *path)
    {
        m_img  = cv::imread(path, 1);
        cv::cvtColor(m_img, m_img, cv::COLOR_BGR2GRAY);    
    }
    
    
    void MyWindow::paintEvent(QPaintEvent *ev)
    {
        QPainter painter{this};
        if (m_img.data)
        {
            QImage img{m_img.data, m_img.cols, m_img.rows, QImage::Format_RGB888};
            painter.drawImage(QRectF(0, 0, 300, 300), img);
        }
    }
    

    我仍然有一些伪影,因为我没有深入调查,但你必须使用像素格式来找到答案。否则,这将从 cv::Mat 对象显示到 Qt。

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多