C++ 使用QImage::loadFromData将cv::mat转换为QImage
我发现了类似的话题,但不是这个。你知道下面的代码有什么问题吗?它返回'loaded=false',这显然意味着无法加载图像数据C++ 使用QImage::loadFromData将cv::mat转换为QImage,c++,qt,opencv,qimage,C++,Qt,Opencv,Qimage,我发现了类似的话题,但不是这个。你知道下面的代码有什么问题吗?它返回'loaded=false',这显然意味着无法加载图像数据 cv::Mat mymat; QImage qimg; mymat = cv::imread("C:\\testimages\\img1.png"); int len = mymat.total()*mymat.elemSize(); bool loaded = qimg.loadFromData((uchar*)mymat.data, len, "PNG"); 谢谢
cv::Mat mymat;
QImage qimg;
mymat = cv::imread("C:\\testimages\\img1.png");
int len = mymat.total()*mymat.elemSize();
bool loaded = qimg.loadFromData((uchar*)mymat.data, len, "PNG");
谢谢大家! cv::Mat类型保存解码图像。因此,您不能要求
QImage
使用loadFromData()
方法再次对其进行解码
您需要设置格式与元素类型匹配的图像,使用Mat::type()
检索,然后将原始数据从矩阵复制到图像,或者为数据设置QImage
标题。在OpenCV术语中,“头”表示不保存自己数据的对象
下面的代码设置标题QImage
QMap<int, QImage::Format> fmtMap;
fmtMap.insert(CV8_UC4, QImage::Format_ARGB32);
fmtMap.insert(CV_8UC3, QImage::Format_RGB888)
// We should convert to a color image since 8-bit indexed images can't be painted on
cv::Mat mat = cv::imread("C:\\testimages\\img1.png", CV_LOAD_IMAGE_COLOR);
Q_ASSERT(fmtMap.contains(cvImage.type());
Q_ASSERT(mat.isContinuous());
QImage img(cvImage.data, cvImage.cols, cvImage.rows, fmtMap[cvImage.type()]);
// The matrix *must* outlive the image, otherwise the image will access a dangling pointer to data
您可能想使用一个关于qimage cv::mat转换问题的开源实现:。祝你好运。谢谢你的信息!我成功地使用与您建议的类似的'QImage'构造函数加载了图像:但我想使用'loadFromData()'方法。您不能使用
loadFromData()
,因为它不能执行您想要执行的操作。如果你真的想把QImage
复制成Mat
,那么你想要的几乎就是memcpy
到bits()
。地图上的小错误:CV8_UC4应该是CV_8UC4。琐事问题:倒置的地图看起来像什么,如何看到0xrrggbb和0xrrggbb的区别。
QMap<QImage::Format, int> fmtMap;
fmtMap.insert(QImage::Format_ARGB32, CV8_UC4);
fmtMap.insert(QImage::Format_RGB32, CV8_UC4);
fmtMap.insert(QImage::Format_RGB888, CV_8UC3);
QImage img;
img.load("C:\\testimages\\img1.png");
Q_ASSERT(fmtMap.contains(img.format()));
cv::Mat mat(img.height(), img.width(), fmtMap[img.format()], img.bits());
// The image *must* outlive the matrix, otherwise the matrix will access a dangling pointer to data