OpenCV Mat导致SIGABRT崩溃



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

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

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

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

的被害者。我得到同样的错误,即使投影设置为常规图像

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

您的OpenCV基本功能不太可能出现故障。因此,您的OpenCV可能没有配置为使用Qt支持构建。
检查表:

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

我也有同样的问题。简单的答案是——使用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);
    }
}

我仍然有一些文物,因为我没有深入调查,但你必须玩像素格式找到答案。否则,这将显示cv::Mat对象中的东西给Qt。

最新更新