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
C++ 从cvMat到QImage_C++_Qt_Opencv_Qimage_Opencv Mat - Fatal编程技术网

C++ 从cvMat到QImage

C++ 从cvMat到QImage,c++,qt,opencv,qimage,opencv-mat,C++,Qt,Opencv,Qimage,Opencv Mat,我想将图像从cvMat类型转换为Qimage,使用我的实际代码,应用程序无法工作;我已经用另一种方法做了(用Qimage垫起来,效果很好) 请告诉我我的代码出了什么问题 以下是我的Qimage到Mat的代码: Mat qimage2mat(const QImage& qimage) { cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.byte

我想将图像从cvMat类型转换为Qimage,使用我的实际代码,应用程序无法工作;我已经用另一种方法做了(用Qimage垫起来,效果很好) 请告诉我我的代码出了什么问题

以下是我的Qimage到Mat的代码:

Mat qimage2mat(const QImage& qimage) {
    cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine());
    cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 );
    int from_to[] = { 0,0,  1,1,  2,2 };
    cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 );
    return mat2;
}
这是我的Mat到Qimage的代码

QImage mat2qimage(const Mat& mat) {
    Mat rgb;
    cvtColor(mat, rgb, CV_BGR2RGB);
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);
}

提前感谢您

正如@SpamBot提到的,当Mat超出范围时,数据将被释放。尝试深度复制数据:

QImage mat2qimage(const Mat& mat) 
{
    Mat rgb;
    cvtColor(mat, rgb, CV_BGR2RGB);
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888).copy();
}

Mat rgb
超出范围,在功能结束时被删除。复制图像数据或从寿命更长的
mat
转换图像数据。能否发送电子邮件解释如何复制数据,或者,廉价的解决方案,使用
new
创建
mat*rgb
。它不起作用,我认为使用的格式有问题此应用程序已请求运行时以异常方式终止它。。。对我来说,这个代码似乎有效。。。你能找出mat.type()吗?你能找出它在哪一行代码中崩溃吗?您是否能够在程序中运行不同的OpenCV代码而不会崩溃?是的,我的应用程序在不调用mat2qimage的情况下工作正常