从cvMat转换为QImage

3
我会尽力帮忙翻译,以下是你需要翻译的内容:

我想把一个cvMat类型的图像转换成Qimage类型,但我的实际代码无法正常工作;我已经做了另一种方式(从Qimage到Mat),它可以正常工作,请告诉我我的代码哪里出了问题。

这是我从Qimage到Mat的代码:


Translated:

我想将一个cvMat类型的图像转换为Qimage类型,但使用我的实际代码时应用程序无法工作。我已经成功地将Qimage转换为Mat,但请告诉我我的代码哪里出了问题。

以下是我从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);
}

thank you by advance


Mat rgb在函数结束时超出作用域并被删除。复制图像数据或从寿命更长的mat进行转换。 - SpamBot
你能否解释一下如何复制数据? - ner
或者,廉价的解决方案是使用 new 创建一个 Mat * rgb - SpamBot
1个回答

4

正如@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();
}

它不起作用,我认为使用的格式存在问题。 - ner
此应用程序已请求运行时以异常方式终止。 - ner
奇怪...对我来说这段代码似乎是可以工作的...你能找出mat.type()吗?你能找出它在哪一行代码崩溃了吗?你能在程序中运行不同的OpenCV代码而不崩溃吗? - Micka
是的,我的应用程序在不调用mat2qimage的情况下工作正常。 - ner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接