Сбой при анализе изображения из необработанных данных в OpenCV - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь загрузить QImage и cv :: Mat настолько эффективно, насколько это возможно.

Я делаю это, сначала открывая файл изображения и загружая его в QByteArray, затем анализируя его с помощью QImage и cv :: imread индивидуально.

QImage анализируется очень хорошо, но cv :: Mat никогда не декодируется, он продолжает возвращать ноль ...

Я пробовал 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());
}

Но у этого есть свой собственный набор проблем

...