QT与OpenCV开发常用的图像格式转换函数:QImage转Mat、Mat转QImage、QImage转IplImage、IplImage转QImage

在 Qt 和 OpenCV 开发中,常用的图像格式转换函数如下:

1. QImage 转 Mat:

Mat QImageToMat(const QImage &image, bool cloneImageData = true)
{
    Mat mat;
    switch (image.format())
    {
        case QImage::Format_ARGB32:
        case QImage::Format_ARGB32_Premultiplied:
            mat = Mat(image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine());
            break;

        case QImage::Format_RGB32:
            mat = Mat(image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine());
            cvtColor(mat, mat, COLOR_RGBA2BGRA);
            break;

        case QImage::Format_RGB888:
            mat = Mat(image.height(), image.width(), CV_8UC3, const_cast<uchar*>(image.bits()), image.bytesPerLine());
            cvtColor(mat, mat, COLOR_RGB2BGR);
            break;

        default:
            qWarning() << "Unsupported image format";
            break;
    }

    if (cloneImageData)
        return mat.clone();
    else
        return mat;
}

2. Mat 转 QImage:

QImage MatToQImage(const Mat &mat)
{
    QImage::Format format;
    switch (mat.type())
    {
        case CV_8UC4:
            format = QImage::Format_ARGB32;
            break;

        case CV_8UC3:
            format = QImage::Format_RGB888;
            break;

        default:
            qWarning() << "Unsupported matrix type";
            return QImage();
    }

    QImage image(mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), format);
    return image.copy();
}

3. QImage 转 IplImage(需要包含 <opencv2/opencv.hpp> 头文件):

IplImage *QImageToIplImage(const QImage &image)
{
    IplImage *iplImg = cvCreateImage(cvSize(image.width(), image.height()), IPL_DEPTH_8U, 3);

    for (int y = 0; y < image.height(); ++y)
    {
        const uchar* qImageLine = image.constScanLine(y);
        uchar* iplImgLine = reinterpret_cast<uchar*>(iplImg->imageData + y * iplImg->widthStep);
        memcpy(iplImgLine, qImageLine, image.bytesPerLine());
    }

    return iplImg;
}

4. IplImage 转 QImage(需要包含 <opencv2/opencv.hpp> 头文件):

QImage IplImageToQImage(const IplImage *iplImg)
{
    QImage::Format format;
    switch (iplImg->nChannels)
    {
        case 1:
            format = QImage::Format_Grayscale8;
            break;

        case 3:
            format = QImage::Format_RGB888;
            break;

        default:
            qWarning() << "Unsupported IplImage format";
            return QImage();
    }

    QImage image(iplImg->width, iplImg->height, format);
    for (int y = 0; y < iplImg->height; ++y)
    {
        const uchar* iplImgLine = reinterpret_cast<const uchar*>(iplImg->imageData + y * iplImg->widthStep);
        uchar* qImageLine = image.scanLine(y);
        memcpy(qImageLine, iplImgLine, iplImg->widthStep);
    }

    return image;
}

上述代码提供了常见的图像格式转换函数,可以在 Qt 和 OpenCV 之间进行图像格式转换。

猜你喜欢

转载自blog.csdn.net/qq_26093511/article/details/131548222