//qimage转cvmat
cv::Mat MainWindow::QImageTocvMat(const QImage image) {
cv::Mat mat( image.height(), image.width(),CV_8UC4,const_cast<uchar*>(image.bits()), static_cast<size_t>(image.bytesPerLine())
cv::Mat matNoAlpha;
cvtColor(mat, matNoAlpha, cv::COLOR_BGRA2BGR);
return matNoAlpha;
}
//cvmat转qimage
QImage MainWindow::cvMatToQImage(const cv::Mat mat) {
cv::Mat temp = mat.clone();
QImage image(temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
QImage image2 = image.rgbSwapped();
return image2.copy();
}
网上说的qimage深拷贝或者mat四字节对齐问题,也是没有效果
调整以下代码以改善问题:
QImage MainWindow::cvMatToQImage(const cv::Mat mat) {
// 为避免图像内容被更改,请使用clone
cv::Mat temp = mat.clone();
// 试图创建QImage时,设置格式为Format_RGB888
QImage image(temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
// 将QImage转换为与OpenCV格式相对应的格式
return image.rgbSwapped();
}
cv::Mat MainWindow::QImageTocvMat(const QImage image) {
// 将QImage转换为Mat格式
cv::Mat mat(image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), static_cast<size_t>(image.bytesPerLine()));
// 转换颜色空间为BGR
cv::Mat matNoAlpha;
cv::cvtColor(mat, matNoAlpha, cv::COLOR_BGRA2BGR);
return matNoAlpha;
}