Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QImage::loadFromData将cv::mat转换为QImage_C++_Qt_Opencv_Qimage - Fatal编程技术网

C++ 使用QImage::loadFromData将cv::mat转换为QImage

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"); 谢谢

我发现了类似的话题,但不是这个。你知道下面的代码有什么问题吗?它返回'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类型保存解码图像。因此,您不能要求
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