首页 > 解决方案 > 从 OpenCV 中的原始数据解析图像失败

问题描述

我试图尽可能高效地加载 QImage 和 cv::Mat 。

我首先打开图像文件,并将其加载到 QByteArray 中,然后使用 QImage 和 cv::imread 单独解析它。

QImage 被解析得很好,但 cv::Mat 永远不会被解码,它一直返回 null ......

我试过 CV_8UC3,但这会引发错误:

OpenCV(4.2.0) /opencv/main/modules/imgcodecs/src/loadsave.cpp:732: error: (-215:Assertion failed) buf.checkVector(1, CV_8U) > 0 in function 'imdecode_'

帮助?

bool ImageUtils::ReadCVandQT(const QString& fileName, QImage& qtImageOut, cv::Mat cvImageOut, const char* format)
{
    // Open file
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly))
        return false;

    // Get file data
    QByteArray byteArray = file.readAll();
    file.close();

    // Get QImage
    qtImageOut = QImage::fromData(byteArray, format);
    if (qtImageOut.isNull())
        return false;

    // Get cv::Mat ===FAILS HERE===
    cvImageOut = cv::imdecode(cv::Mat(1, byteArray.size(), CV_8U, byteArray.data()), cv::IMREAD_COLOR | cv::IMREAD_ANYDEPTH | cv::IMREAD_ANYCOLOR);

    // This always returns false
    if (cvImageOut.data == nullptr)
        return false;
    return true;
}

编辑:

我尝试加载的图像可以是任何格式,因此需要对其进行解码

我还可以使用以下方法将其从 QImage 转换为 cv::Mat:

if (qimage.format() == QImage::Format_RGB888) {
    return cv::Mat(qimage.height(), qimage.width(), CV_8UC3, (uint8_t*)qimage.constBits(), qimage.bytesPerLine());
} else {
    QImage rgb888 = qimage.convertToFormat(QImage::Format_RGB888);
    return cv::Mat(rgb888.height(), rgb888.width(), CV_8UC3, (uint8_t*)rgb888.constBits(), rgb888.bytesPerLine());
}

但这有其自身的一系列问题

标签: c++imageqtopencvdecode

解决方案


推荐阅读