Я пытаюсь загрузить 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());
}
Но у этого есть свой собственный набор проблем