发现一个Mat转QImage一个大坑

最近在做opencv的一个项目,在子线程中运行摄像头同时在主线程中显示,但是发一个问题,关闭.exe文件之后总是提示QtGuid.dll 0xC0000005: 读取位置 xxx时发生访问冲突, ui->label->setPixmap(QPixmap::fromImage(img));总是提示这一句是有问题,给我找的啊,setPixmap这个函数有问题吗,清pixmap内存都做了,还是有问题。我同时做的另外一个ffmpeg的项目也是在子线程中解码发送image给主线程,同样的流程没有发生这样的问题,那到底是什么问题呢?
我把上面语句分解成 QPixmap pic = QPixmap::fromImage(img);labels->setPixmap(pic);这个时候提示在第一句了,看来不是setPixmap的问题,就是这个img的问题了,看了一下我用的Mat转QImage语句 QImage img((const uchar*)rgbImg.data,
rgbImg.cols, rgbImg.rows,
rgbImg.cols * rgbImg.channels(),
QImage::Format_RGB888);
问题可能就出在这个 转换上,还是老老实实用
Mat QImage2cvMat(QImage image)
{
cv::Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.bits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.bits(), image.bytesPerLine());
cv::cvtColor(mat, mat, COLOR_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.bits(), image.bytesPerLine());
break;
}
return mat;
}

QImage MatToQImage(const cv::Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if (mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
// Copy input Mat
uchar *pSrc = mat.data;
for (int row = 0; row < mat.rows; row++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if (mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar pSrc = (const uchar)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4)
{
qDebug() << “CV_8UC4”;
// Copy input Mat
const uchar pSrc = (const uchar)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else
{
qDebug() << “ERROR: Mat could not be converted to QImage.”;
return QImage();
}
}
这个语句吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值