最近在做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(); } } 这个语句吧