OpenCV Mat使用SIGABRT导致崩溃

时间:2016-07-02 07:28:35

标签: c++ qt opencv ubuntu

我通过创建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");

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我遇到了同样的问题。简单的答案是-使用Qt调用进行事件处理和绘制图像。在Qt屏幕上显示CV矩阵相对简单。

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);
    }
}

由于我没有进行深入研究,所以我仍然有一些伪像,但是您必须使用pixelformat来找到答案。否则,这将从cv :: Mat对象向Qt显示东西。