c++ - 从 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());
}
但这有其自身的一系列问题
解决方案
推荐阅读
- debugging - 在生产服务器上设置 Blazor 调试
- android - 在 DrawerLayout 中以编程方式更改浮动操作按钮图像
- typescript - 如何在离子 UIActionSheet 中添加多行?
- sql - SQL - 查找快照日期之间的新开始者和离开者的数量
- reactjs - React Hooks Antd 道具更新
- r - R中的OECD包和下载数据的问题
- sql-server - 在 SSIS 派生列中将字符串转换为日期
- python - 在 Xcode 中创建项目时如何更改 python 版本
- parsing - Lucene 解析器异常中标签的含义
- r - 如何将重复的功能折叠成主功能?