我通过创建一个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
支持构建。
检查表:
- 消除所有
highgui
方法,以确保核心OpenCV
工具正常工作。您可以用imwrite
替换namedWindow
和imshow
。 - 再次检查
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。