QImage 与 Mat 互转,与其他博主有不同,欢迎留言探讨

经实践,发现一些诡异的事情,欢迎留言探讨:

const &修饰的函参(或值传递的函参)竟然被改变了,r/b被调换。不符合c++常识。

原因可能是指针直接指向了函参的数据内存,r/b被改, 下述代码中的(void)image.constBits()或者(const uchar )mat.data

不过,A.rgbSwapped()不会更改A的数据。

以防万一,在cvtColor变更r/b的地方,单独搞了个变量来承接。

cv::Mat ImgFormatConvert::QImage2Mat(const QImage& image)
{
    cv::Mat mat,mat_out;    //如果把mat_out变更为mat,那么参数image的r/b被调换。即使被const修饰,依然被更改,比较诡异。参数变为值传递,也依然被更改。
    switch (image.format())
    {
    case QImage::Format_RGB32:                              //一般Qt读入本地彩色图后为此格式
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat_out, cv::COLOR_BGRA2BGR);     //转3通道,OpenCV一般用3通道的
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat_out, cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    }
    return mat_out;
}

QImage ImgFormatConvert::Mat2QImage(const cv::Mat& mat)
{
    QImage image;
    if (mat.type() == CV_8UC1 || mat.type() == CV_8U)
    {
        image=QImage((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
    }
    else if (mat.type() == CV_8UC3)
    {
        image=QImage((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888).rgbSwapped(); //mat部分不会被改变
    }
    return image;
}

原文链接: https://www.cnblogs.com/xixixing/p/15797971.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/185321

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午10:54
下一篇 2023年2月12日 上午10:54

相关推荐