qimage互转cvmat出错

软件要进行大量的qimage和cvmat互相转换,以及cvmat相关颜色处理
颜色处理以及转换次数多了后就会出现图片变成黑白条状,并且横向会缩小

img

这是用到的转换代码

//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;
}